# Каталог и цены

> Каталог стилей и настроек монтажа, пресеты экспорта, цена операции до запуска и спецификация OpenAPI — эндпоинты, доступные с любым токеном.

Источник: https://docs.slicer.media/api/reference/catalog/

Каталог — тот же, что у приложений Slicer: шаблоны, шрифты, акцентные цвета, оформление субтитров, параметры монтажа, режиссура, длительности, ограничения материалов и цены. Названия и описания — на русском и английском. Каталог меняется редко, его удобно кэшировать.

## Стили, настройки и цены

`GET /v1/styles`

- **Области доступа:** любой токен
- **Лимит:** обычный

### Запрос

**curl**

```bash
curl "https://api.slicer.media/v1/styles" \
  -H "Authorization: Bearer $SLICER_TOKEN"
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/styles', {
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
  },
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.get(
    "https://api.slicer.media/v1/styles",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

**Поля ответа: `Styles` (15)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `templates` _(обязательное)_ | `object[]` |     |
| `templates[].id` _(обязательное)_ | `string` |     |
| `fonts` _(обязательное)_ | `object[]` |     |
| `fonts[].id` _(обязательное)_ | `string` |     |
| `colors` _(обязательное)_ | `object[]` |     |
| `colors[].id` _(обязательное)_ | `string` |     |
| `subtitleDesigns` _(обязательное)_ | `object[]` |     |
| `subtitleDesigns[].id` _(обязательное)_ | `string` |     |
| `subtitleOptions` | `object[]` | Настройки субтитров (выделение слова, появление, слов на экране, регистр) и их значения |
| `subtitleOptions[].id` _(обязательное)_ | `string` |     |
| `params` _(обязательное)_ | `object[]` |     |
| `params[].id` _(обязательное)_ | `string` |     |
| `direction` _(обязательное)_ | `object` |     |
| `defaults` _(обязательное)_ | `object` |     |
| `pricing` _(обязательное)_ | `object` |     |

Пример ответа:

```json
{
  "ok": true,
  "data": {
    "templates": [
      {
        "id": "string"
      }
    ],
    "fonts": [
      {
        "id": "string"
      }
    ],
    "colors": [
      {
        "id": "string"
      }
    ],
    "subtitleDesigns": [
      {
        "id": "string"
      }
    ],
    "subtitleOptions": [
      {
        "id": "string"
      }
    ],
    "params": [
      {
        "id": "string"
      }
    ],
    "direction": {},
    "defaults": {},
    "pricing": {}
  }
}
```

## Пресеты экспорта и профиль по умолчанию

`GET /v1/export-presets`

- **Области доступа:** любой токен
- **Лимит:** обычный

### Запрос

**curl**

```bash
curl "https://api.slicer.media/v1/export-presets" \
  -H "Authorization: Bearer $SLICER_TOKEN"
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/export-presets', {
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
  },
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.get(
    "https://api.slicer.media/v1/export-presets",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

**Поля ответа: `object` (4)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `defaultProfile` _(обязательное)_ | `ExportProfile` |     |
| `presets` _(обязательное)_ | `object[]` |     |
| `presets[].id` _(обязательное)_ | `string` |     |
| `presets[].profile` _(обязательное)_ | `ExportProfile` |     |

Пример ответа:

```json
{
  "ok": true,
  "data": {
    "defaultProfile": {
      "container": "mp4",
      "codec": "h264",
      "resolution": "720p",
      "fps": 24,
      "quality": "balanced",
      "colorDepth": 8,
      "audioBitrate": 128,
      "loudness": -14
    },
    "presets": [
      {
        "id": "string",
        "profile": {
          "container": "mp4",
          "codec": "h264",
          "resolution": "720p",
          "fps": null,
          "quality": "balanced",
          "colorDepth": null,
          "audioBitrate": null,
          "loudness": null
        }
      }
    ]
  }
}
```

## Цена операции

`POST /v1/estimate`

- **Области доступа:** любой токен
- **Лимит:** обычный

### Тело запроса `EstimateRequest`

| Поле | Тип | Описание |
| --- | --- | --- |
| `kind` _(обязательное)_ | `string` | — `montage` · `remount` · `retry` · `assistant` · `translate` · `transcribe` |
| `projectId` | `integer` | Для повтора и распознавания речи |

### Запрос

**curl**

```bash
curl -X POST "https://api.slicer.media/v1/estimate" \
  -H "Authorization: Bearer $SLICER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"kind":"montage"}'
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/estimate', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "kind": "montage"
  }),
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.post(
    "https://api.slicer.media/v1/estimate",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
    json={
        "kind": "montage",
    },
)
body = response.json()
```

### Ответ

**Поля ответа: `Quote` (8)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `status` _(обязательное)_ | `"quote"` |     |
| `cost` _(обязательное)_ | `integer` | Цена в токенах; повторите запрос с `confirmCost`, равным ей. У операции по себестоимости (`atCost`) — предельная: спишется фактическая себестоимость, не больше |
| `free` _(обязательное)_ | `boolean` | Операция бесплатна (первый ролик, бесплатный повтор) |
| `estimate` | `number` | Операция по себестоимости: ожидаемая цена в токенах (дробно) |
| `atCost` | `boolean` | Цена — себестоимость ИИ-сервисов без наценки: списывается фактическая, не больше `cost` |
| `available` _(обязательное)_ | `integer` | Сколько токенов доступно сейчас |
| `enough` _(обязательное)_ | `boolean` | Токенов хватает |
| `spendLimitLeft` _(обязательное)_ | `integer \| null` | Остаток месячного лимита расходов токена; `null` — без лимита |

Пример ответа:

```json
{
  "ok": true,
  "data": {
    "status": "quote",
    "cost": 24,
    "free": true,
    "estimate": 1.5,
    "atCost": true,
    "available": 240,
    "enough": true,
    "spendLimitLeft": 200
  }
}
```

## Эта спецификация (OpenAPI 3.1)

`GET /v1/openapi.json`

- **Области доступа:** без токена
- **Лимит:** обычный

### Запрос

**curl**

```bash
curl "https://api.slicer.media/v1/openapi.json"
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/openapi.json');
const { ok, data, error } = await response.json();
```

**Python**

```python
import requests

response = requests.get(
    "https://api.slicer.media/v1/openapi.json",
)
body = response.json()
```

### Ответ

Тело ответа описано в тексте страницы.

## Схемы

`Styles` — Тот же каталог, что у приложений: id, названия (ru/en), описания, значения по умолчанию и цены

| Поле | Тип | Описание |
| --- | --- | --- |
| `templates` _(обязательное)_ | `object[]` |     |
| `templates[].id` _(обязательное)_ | `string` |     |
| `fonts` _(обязательное)_ | `object[]` |     |
| `fonts[].id` _(обязательное)_ | `string` |     |
| `colors` _(обязательное)_ | `object[]` |     |
| `colors[].id` _(обязательное)_ | `string` |     |
| `subtitleDesigns` _(обязательное)_ | `object[]` |     |
| `subtitleDesigns[].id` _(обязательное)_ | `string` |     |
| `subtitleOptions` | `object[]` | Настройки субтитров (выделение слова, появление, слов на экране, регистр) и их значения |
| `subtitleOptions[].id` _(обязательное)_ | `string` |     |
| `params` _(обязательное)_ | `object[]` |     |
| `params[].id` _(обязательное)_ | `string` |     |
| `direction` _(обязательное)_ | `object` |     |
| `defaults` _(обязательное)_ | `object` |     |
| `pricing` _(обязательное)_ | `object` |     |

`MontageSettingsInput` — Любая часть настроек монтажа; недостающее — по умолчанию, неизвестные id — по умолчанию

| Поле | Тип | Описание |
| --- | --- | --- |
| `templateId` | `string` | Шаблон: `bold`, `clean`, `pop` |
| `fontId` | `string` | Шрифт субтитров: punch, poster, block, wide, editorial, rounded, script, mono |
| `colorId` | `string` | Акцент: amber, azure, lime, crimson, fuchsia, mint, violet, white |
| `subtitles` | `object` | Вид субтитров; частичная правка сохраняет остальные поля. Новое `design` без `highlight`/`animation`/`words` возвращает их к `auto` |
| `subtitles.enabled` | `boolean` |     |
| `subtitles.design` | `string` | — `dynamic` · `karaoke` · `classic` · `minimal` · `pop` · `box` · `word` |
| `subtitles.size` | `string` | — `small` · `medium` · `large` |
| `subtitles.position` | `string` | `auto` — каждая фраза там, где в кадре свободнее (не на лице, хуке, плашках, титрах) — `auto` · `top` · `center` · `bottom` |
| `subtitles.speakerColors` | `boolean` | Слова каждого говорящего — своим цветом |
| `subtitles.highlight` | `string` | Слово, которое звучит: цвет, увеличение, плашка, подчёркивание; `auto` — как задумано оформлением — `auto` · `none` · `color` · `pop` · `box` · `underline` |
| `subtitles.animation` | `string` | Появление фразы; `words` — по словам, по мере речи — `auto` · `none` · `fade` · `pop` · `slide` · `words` |
| `subtitles.words` | `string` | Сколько слов на экране сразу — `auto` · `one` · `few` · `line` · `phrase` |
| `subtitles.letterCase` | `string` | Регистр; `auto` — как задумано шрифтом — `auto` · `upper` · `normal` |
| `params` | `object` | Параметры монтажа, см. `GET /v1/styles` → `params` |
| `params.emoji` | `boolean` |     |
| `params.soundEffects` | `boolean` |     |
| `params.mediaCards` | `boolean` |     |
| `params.plaques` | `boolean` |     |
| `params.cameraMotion` | `boolean` |     |
| `params.introZoom` | `boolean` |     |
| `params.hook` | `boolean` |     |
| `smartCut` | `boolean` | Умная нарезка: убрать паузы и повторы |
| `targetDurationSec` | `15 \| 30 \| 60 \| 90 \| null` | Длительность; `null` — решает ИИ (до 90 с) |
| `language` | `string` | — `auto` · `ru` · `en` |
| `direction` | `object` |     |
| `direction.mode` | `string` | — `auto` · `talking` · `story` · `product` · `aesthetic` |
| `direction.pace` | `string` | — `calm` · `balanced` · `dynamic` |
| `direction.effects` | `string` | — `off` · `light` · `bold` |
| `direction.narration` | `boolean` | Закадровый голос ИИ |
| `direction.voice` | `string` | — `warm` · `soft` · `confident` · `deep` |

`ExportProfile`

| Поле | Тип | Описание |
| --- | --- | --- |
| `container` | `string` | — `mp4` · `mov` |
| `codec` | `string` | — `h264` · `hevc` |
| `resolution` | `string` | — `720p` · `1080p` · `1440p` · `2160p` |
| `fps` | `24 \| 25 \| 30` |     |
| `quality` | `string` | — `balanced` · `high` · `max` |
| `colorDepth` | `8 \| 10` | 10 бит — только с HEVC |
| `audioBitrate` | `128 \| 192 \| 256 \| 320` |     |
| `loudness` | `-14 \| -16 \| -23` | Громкость, LUFS |

`Quote`

| Поле | Тип | Описание |
| --- | --- | --- |
| `status` _(обязательное)_ | `"quote"` |     |
| `cost` _(обязательное)_ | `integer` | Цена в токенах; повторите запрос с `confirmCost`, равным ей. У операции по себестоимости (`atCost`) — предельная: спишется фактическая себестоимость, не больше |
| `free` _(обязательное)_ | `boolean` | Операция бесплатна (первый ролик, бесплатный повтор) |
| `estimate` | `number` | Операция по себестоимости: ожидаемая цена в токенах (дробно) |
| `atCost` | `boolean` | Цена — себестоимость ИИ-сервисов без наценки: списывается фактическая, не больше `cost` |
| `available` _(обязательное)_ | `integer` | Сколько токенов доступно сейчас |
| `enough` _(обязательное)_ | `boolean` | Токенов хватает |
| `spendLimitLeft` _(обязательное)_ | `integer \| null` | Остаток месячного лимита расходов токена; `null` — без лимита |
