# Экспорт и публикация

> Эндпоинты экспорта Slicer API — рендер ролика с параметрами файла и публикацией, список публикаций проекта и подключённые аккаунты соцсетей.

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

Экспорт бесплатный и перерисовывает ролик по текущему документу. С полем `publish` ролик после рендера публикуется в подключённые аккаунты — для этого токену нужна область `publish`. Подключать соцсети можно только в приложении, TikTok — публиковать только из приложения. Подробно — [Экспорт и публикация](https://docs.slicer.media/api/export/).

## Отрендерить ролик (бесплатно)

`POST /v1/projects/{id}/export`

- **Области доступа:** `projects:write`
- **Лимит:** платные операции

С `publish` — публикует после рендера (нужна область `publish`). TikTok — только из приложения Slicer.

### Параметры пути

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `integer` | — ≥ 1 |

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

| Поле | Тип | Описание |
| --- | --- | --- |
| `profile` | `ExportProfile` |     |
| `publish` | `PublishRequestItem[]` | — 0–8 |

### Запрос

**curl**

```bash
curl -X POST "https://api.slicer.media/v1/projects/42/export" \
  -H "Authorization: Bearer $SLICER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profile":{"container":"mp4","codec":"h264","resolution":"720p","fps":24,"quality":"balanced","colorDepth":8,"audioBitrate":128,"loudness":-14},"publish":[{"accountId":42,"title":"Монтаж за 3 минуты","caption":"string","options":{}}]}'
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/projects/42/export', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "profile": {
      "container": "mp4",
      "codec": "h264",
      "resolution": "720p",
      "fps": 24,
      "quality": "balanced",
      "colorDepth": 8,
      "audioBitrate": 128,
      "loudness": -14
    },
    "publish": [
      {
        "accountId": 42,
        "title": "Монтаж за 3 минуты",
        "caption": "string",
        "options": {}
      }
    ]
  }),
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.post(
    "https://api.slicer.media/v1/projects/42/export",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
    json={
        "profile": {
            "container": "mp4",
            "codec": "h264",
            "resolution": "720p",
            "fps": 24,
            "quality": "balanced",
            "colorDepth": 8,
            "audioBitrate": 128,
            "loudness": -14,
        },
        "publish": [{
            "accountId": 42,
            "title": "Монтаж за 3 минуты",
            "caption": "string",
            "options": {},
        }],
    },
)
body = response.json()
```

### Ответ

**Поля ответа: `ProjectDetails` (44)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `integer` |     |
| `title` _(обязательное)_ | `string` |     |
| `status` _(обязательное)_ | `string` | `draft` — проект «Сам в редакторе» до первого экспорта: правьте операциями и экспортируйте — `queued` · `processing` · `succeeded` · `failed` · `cancelled` · `draft` |
| `mode` _(обязательное)_ | `string` | `ai` — монтаж ИИ-режиссёром; `manual` — материалы на таймлайне как есть, бесплатно (платны только ИИ-операции) — `ai` · `manual` |
| `stage` _(обязательное)_ | `string \| null` |     |
| `progress` _(обязательное)_ | `integer` | Прогресс текущего запуска, % |
| `client` _(обязательное)_ | `string \| null` | Где создан: web, mobile, api, mcp |
| `settings` _(обязательное)_ | `object` | Настройки монтажа (см. MontageSettingsInput) |
| `brief` _(обязательное)_ | `string \| null` |     |
| `isFree` _(обязательное)_ | `boolean` |     |
| `watermark` _(обязательное)_ | `boolean` |     |
| `tokensCost` _(обязательное)_ | `integer` |     |
| `error` _(обязательное)_ | `object \| null` |     |
| `error.code` _(обязательное)_ | `string` |     |
| `error.message` _(обязательное)_ | `string` |     |
| `durationSec` _(обязательное)_ | `number \| null` |     |
| `versionChoice` _(обязательное)_ | `integer[] \| null` | Id версий, ждущих выбора; монтаж отдаёт одну версию, поэтому обычно `null` |
| `result` _(обязательное)_ | `object \| null` |     |
| `result.url` _(обязательное)_ | `string (uri)` | Скачать с токеном (поддерживается Range) |
| `result.posterUrl` _(обязательное)_ | `string (uri) \| null` |     |
| `result.container` _(обязательное)_ | `string` |     |
| `result.info` _(обязательное)_ | `object \| null` |     |
| `appUrl` _(обязательное)_ | `string (uri)` | Проект в веб-приложении Slicer |
| `sourcesAvailable` _(обязательное)_ | `boolean` | Исходники хранятся 7 дней после монтажа |
| `createdAt` _(обязательное)_ | `string` | Дата и время ISO 8601, UTC |
| `finishedAt` _(обязательное)_ | `string \| null` |     |
| `stages` _(обязательное)_ | `object[]` |     |
| `stages[].stage` _(обязательное)_ | `string` |     |
| `stages[].status` _(обязательное)_ | `string` | — `pending` · `running` · `succeeded` · `failed` · `skipped` |
| `stages[].inRun` _(обязательное)_ | `boolean` | Часть текущего запуска (не взят готовым) |
| `stages[].startedAt` _(обязательное)_ | `string \| null` |     |
| `stages[].finishedAt` _(обязательное)_ | `string \| null` |     |
| `stages[].durationSec` _(обязательное)_ | `number \| null` |     |
| `stages[].progress` _(обязательное)_ | `integer` |     |
| `stages[].tokens` _(обязательное)_ | `integer` | Доля цены запуска |
| `run` _(обязательное)_ | `object` |     |
| `run.kind` _(обязательное)_ | `string` |     |
| `run.status` _(обязательное)_ | `string` |     |
| `run.tokens` _(обязательное)_ | `integer` |     |
| `run.tokensState` _(обязательное)_ | `string` | — `free` · `reserved` · `charged` · `refunded` |
| `run.queuedAt` _(обязательное)_ | `string` | Дата и время ISO 8601, UTC |
| `run.startedAt` _(обязательное)_ | `string \| null` |     |
| `run.finishedAt` _(обязательное)_ | `string \| null` |     |
| `versions` _(обязательное)_ | `ProjectVersion[]` |     |

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

```json
{
  "ok": true,
  "data": {
    "id": 42,
    "title": "Монтаж за 3 минуты",
    "status": "queued",
    "mode": "ai",
    "stage": "string",
    "progress": 0.5,
    "client": "string",
    "settings": {},
    "brief": "Динамично, с акцентом на главные мысли",
    "isFree": true,
    "watermark": true,
    "tokensCost": 24,
    "error": {
      "code": "string",
      "message": "string"
    },
    "durationSec": 42.5,
    "versionChoice": [
      1
    ],
    "result": {
      "url": "https://example.com/hook",
      "posterUrl": "https://api.slicer.media/v1/…",
      "container": "string",
      "info": {}
    },
    "appUrl": "https://api.slicer.media/v1/…",
    "sourcesAvailable": true,
    "createdAt": "2026-10-16T09:30:00Z",
    "finishedAt": "2026-10-16T09:30:00Z",
    "stages": [
      {
        "stage": "string",
        "status": "pending",
        "inRun": true,
        "startedAt": "2026-10-16T09:30:00Z",
        "finishedAt": "2026-10-16T09:30:00Z",
        "durationSec": 42.5,
        "progress": 0.5,
        "tokens": 24
      }
    ],
    "run": {
      "kind": "string",
      "status": "string",
      "tokens": 24,
      "tokensState": "free",
      "queuedAt": "2026-10-16T09:30:00Z",
      "startedAt": "2026-10-16T09:30:00Z",
      "finishedAt": "2026-10-16T09:30:00Z"
    },
    "versions": [
      {
        "id": 42,
        "version": null,
        "idea": "string",
        "durationSec": 42.5,
        "current": true,
        "awaitingChoice": true,
        "hasFile": true,
        "createdAt": "2026-10-16T09:30:00Z"
      }
    ]
  }
}
```

## Публикации проекта

`GET /v1/projects/{id}/publications`

- **Области доступа:** `projects:read`
- **Лимит:** обычный

### Параметры пути

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `integer` | — ≥ 1 |

### Запрос

**curl**

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

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/projects/42/publications', {
  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/projects/42/publications",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

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

```json
{
  "ok": true,
  "data": [
    {
      "id": 42,
      "platform": "string",
      "accountName": "Anna",
      "status": "string",
      "url": "https://example.com/hook",
      "errorCode": "string",
      "createdAt": "2026-10-16T09:30:00Z"
    }
  ]
}
```

## Подключённые соцсети

`GET /v1/social/accounts`

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

### Запрос

**curl**

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

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/social/accounts', {
  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/social/accounts",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

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

```json
{
  "ok": true,
  "data": [
    {
      "id": 42,
      "platform": "youtube",
      "name": "Anna",
      "status": "string",
      "apiPublishing": true
    }
  ]
}
```

## Схемы

`ExportRequest`

| Поле | Тип | Описание |
| --- | --- | --- |
| `profile` | `ExportProfile` |     |
| `publish` | `PublishRequestItem[]` | — 0–8 |

`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 |

`PublishRequestItem`

| Поле | Тип | Описание |
| --- | --- | --- |
| `accountId` _(обязательное)_ | `integer` | Подключённый аккаунт из GET /v1/social/accounts |
| `title` | `string` | — ≤ 150 |
| `caption` | `string` | — ≤ 5000 |
| `options` | `object` | Настройки платформы: `{ youtube: { privacy, madeForKids } }`, `{ instagram: { shareToFeed } }`, `{ vk: { privacy, wallpost, groupId } }`, `aiGenerated` |

`Publication`

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `integer` |     |
| `platform` _(обязательное)_ | `string` |     |
| `accountName` _(обязательное)_ | `string \| null` |     |
| `status` _(обязательное)_ | `string` |     |
| `url` _(обязательное)_ | `string \| null` |     |
| `errorCode` _(обязательное)_ | `string \| null` |     |
| `createdAt` _(обязательное)_ | `string` | Дата и время ISO 8601, UTC |

`SocialAccount`

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `integer` |     |
| `platform` _(обязательное)_ | `string` | — `youtube` · `instagram` · `tiktok` · `vk` |
| `name` _(обязательное)_ | `string \| null` |     |
| `status` _(обязательное)_ | `string` |     |
| `apiPublishing` _(обязательное)_ | `boolean` | Можно публиковать через API (TikTok — только из приложения) |
