Правки
Эндпоинты правок в Slicer API — текст ролика с id слов, операции, документ монтажа, субтитры из речи, ИИ-помощник, перевод, стиль, свой режиссёр.
На этой странице
- Ролик текстом с id слов
- Применить правки
- Субтитры из речи
- Задачи распознавания речи
- Команда ИИ-помощнику
- Перевести субтитры
- Автобаланс и подбор цвета (бесплатно)
- Сменить стиль
- Свой режиссёр
- Бриф режиссёра для вашего ИИ-ассистента (бесплатно)
- Кадры исходника (бесплатно)
- Применить план режиссёра (бесплатно)
- Документ монтажа
- Документ монтажа
- Заменить документ монтажа (для продвинутых)
- Схемы
Правки меняют ролик так же, как редактор приложения, и сохраняются сразу. Бесплатны все, кроме субтитров из речи, ИИ-помощника
и перевода субтитров — они стоят по себестоимости ИИ (Субтитры из речи,
ИИ-помощник). Каждая правка передаёт ревизию
rev: если ролик успели изменить, ответ — 409 stale_document. Как этим пользоваться — в руководстве Правки
ролика.
Ролик текстом с id слов
/v1/projects/{id}/transcriptПараметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Запрос
curl "https://api.slicer.media/v1/projects/42/transcript" \
-H "Authorization: Bearer $SLICER_TOKEN"const response = await fetch('https://api.slicer.media/v1/projects/42/transcript', {
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
},
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.get(
"https://api.slicer.media/v1/projects/42/transcript",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()Ответ
Поля ответа: Transcript (90)
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | Ревизия документа: передайте её в правки |
durationSecобязательное | number | |
textобязательное | string | Ролик текстом для LLM: фрагменты со словами w<id>, вырезанное — в [скобках], графика |
blocksобязательное | object[] | |
blocks[].idобязательное | string | |
blocks[].positionобязательное | integer | |
blocks[].sourceIndexобязательное | integer | |
blocks[].kindобязательное | string | words · range |
blocks[].wordsобязательное | object[] | |
blocks[].words[].idобязательное | integer | |
blocks[].words[].textобязательное | string | |
blocks[].words[].cutобязательное | boolean | |
blocks[].words[].accentобязательное | boolean | |
elementsобязательное | object | |
elements.hookобязательное | string | null | |
elements.plaquesобязательное | object[] | |
elements.plaques[].idобязательное | string | |
elements.plaques[].kindобязательное | string | |
elements.plaques[].titleобязательное | string | |
elements.plaques[].fromWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.plaques[].toWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.plaques[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.plaques[].end | number | Где элемент заканчивается в ролике, с |
elements.plaques[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.plaques[].anchor.blockIdобязательное | string | |
elements.plaques[].anchor.atобязательное | number | |
elements.plaques[].anchor.durationобязательное | number | |
elements.cardsобязательное | object[] | |
elements.cards[].idобязательное | string | |
elements.cards[].captionобязательное | string | null | |
elements.cards[].fromWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.cards[].toWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.cards[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.cards[].end | number | Где элемент заканчивается в ролике, с |
elements.cards[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.cards[].anchor.blockIdобязательное | string | |
elements.cards[].anchor.atобязательное | number | |
elements.cards[].anchor.durationобязательное | number | |
elements.emojiобязательное | object[] | |
elements.emoji[].idобязательное | string | |
elements.emoji[].emojiобязательное | string | |
elements.emoji[].wordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.emoji[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.emoji[].end | number | Где элемент заканчивается в ролике, с |
elements.emoji[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.emoji[].anchor.blockIdобязательное | string | |
elements.emoji[].anchor.atобязательное | number | |
elements.emoji[].anchor.durationобязательное | number | |
elements.zoomsобязательное | object[] | |
elements.zooms[].idобязательное | string | |
elements.zooms[].fromWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.zooms[].toWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.zooms[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.zooms[].end | number | Где элемент заканчивается в ролике, с |
elements.zooms[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.zooms[].anchor.blockIdобязательное | string | |
elements.zooms[].anchor.atобязательное | number | |
elements.zooms[].anchor.durationобязательное | number | |
elements.titlesобязательное | object[] | Свободные текстовые слои (титры) |
elements.titles[].idобязательное | string | |
elements.titles[].textобязательное | string | |
elements.titles[].fontобязательное | string | |
elements.titles[].sizeобязательное | number | |
elements.titles[].colorобязательное | string | |
elements.titles[].backgroundобязательное | string | none · box · pill |
elements.titles[].backgroundColor | string | |
elements.titles[].outline | boolean | |
elements.titles[].shadow | boolean | |
elements.titles[].alignобязательное | string | left · center · right |
elements.titles[].xобязательное | number | |
elements.titles[].yобязательное | number | |
elements.titles[].animIn | string | fade · slide · pop · typewriter |
elements.titles[].animOut | string | fade · slide · pop |
elements.titles[].fromWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.titles[].toWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.titles[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.titles[].end | number | Где элемент заканчивается в ролике, с |
elements.titles[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.titles[].anchor.blockIdобязательное | string | |
elements.titles[].anchor.atобязательное | number | |
elements.titles[].anchor.durationобязательное | number | |
elements.markersобязательное | object[] | Маркеры автора на таймлайне (в ролик не попадают); отрезанные не показываются |
elements.markers[].idобязательное | string | |
elements.markers[].timeобязательное | number | |
elements.markers[].labelобязательное | string | null | |
elements.markers[].colorобязательное | string | cyan · yellow · red · green · violet |
elements.soundsобязательное | object[] | Звуковые эффекты, которые поставил автор; отрезанные не показываются |
elements.sounds[].idобязательное | string | |
elements.sounds[].kindобязательное | string | whoosh · pop · ding · click · swipe · rise · boom · chime |
elements.sounds[].timeобязательное | number |
{
"ok": true,
"data": {
"rev": 7,
"durationSec": 42.5,
"text": "string",
"blocks": [
{
"id": "string",
"position": 1,
"sourceIndex": 1,
"kind": "words",
"words": [
{
"id": null,
"text": null,
"cut": null,
"accent": null
}
]
}
],
"elements": {
"hook": "string",
"plaques": [
{
"id": "string",
"kind": "string",
"title": "Монтаж за 3 минуты",
"fromWordId": null,
"toWordId": null,
"start": 1.5,
"end": 1.5,
"anchor": {
"blockId": null,
"at": null,
"duration": null
}
}
],
"cards": [
{
"id": "string",
"caption": "string",
"fromWordId": null,
"toWordId": null,
"start": 1.5,
"end": 1.5,
"anchor": {
"blockId": null,
"at": null,
"duration": null
}
}
],
"emoji": [
{
"id": "string",
"emoji": "string",
"wordId": null,
"start": 1.5,
"end": 1.5,
"anchor": {
"blockId": null,
"at": null,
"duration": null
}
}
],
"zooms": [
{
"id": "string",
"fromWordId": null,
"toWordId": null,
"start": 1.5,
"end": 1.5,
"anchor": {
"blockId": null,
"at": null,
"duration": null
}
}
],
"titles": [
{
"id": "string",
"text": "string",
"font": "string",
"size": 104857600,
"color": "string",
"background": "none",
"backgroundColor": "string",
"outline": true,
"shadow": true,
"align": "left",
"x": 1.5,
"y": 1.5,
"animIn": "fade",
"animOut": "fade",
"fromWordId": null,
"toWordId": null,
"start": 1.5,
"end": 1.5,
"anchor": {
"blockId": null,
"at": null,
"duration": null
}
}
],
"markers": [
{
"id": "string",
"time": 1.5,
"label": "string",
"color": "cyan"
}
],
"sounds": [
{
"id": "string",
"kind": "whoosh",
"time": 1.5
}
]
}
}
}Применить правки
/v1/projects/{id}/editsБесплатно. Id слов — из GET …/transcript. Неприменимые операции пропускаются и перечисляются в skipped.
Параметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса EditsRequest
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | Ревизия из GET …/transcript или …/document |
operationsобязательное | EditOperation[] | 1–80 |
Запрос
curl -X POST "https://api.slicer.media/v1/projects/42/edits" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rev":7,"operations":[{"op":"cut_words","fromWordId":42,"toWordId":42}]}'const response = await fetch('https://api.slicer.media/v1/projects/42/edits', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"rev": 7,
"operations": [
{
"op": "cut_words",
"fromWordId": 42,
"toWordId": 42
}
]
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.post(
"https://api.slicer.media/v1/projects/42/edits",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"rev": 7,
"operations": [{
"op": "cut_words",
"fromWordId": 42,
"toWordId": 42,
}],
},
)
body = response.json()Ответ
Поля ответа: EditsResult (7)
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
appliedобязательное | integer | |
skippedобязательное | object[] | |
skipped[].indexобязательное | integer | |
skipped[].opобязательное | string | |
skipped[].reasonобязательное | string | |
durationSecобязательное | number |
{
"ok": true,
"data": {
"rev": 7,
"applied": 1,
"skipped": [
{
"index": 1,
"op": "string",
"reason": "string"
}
],
"durationSec": 42.5
}
}Субтитры из речи
/v1/projects/{id}/transcribeРаспознаёт речь исходников проекта (ручной проект или новые исходники) — по себестоимости ИИ за минуту звука. Без confirmCost — цена. Идёт в фоне: ход — GET …/transcribe; когда готово, слова — в тексте ролика, субтитры идут за речью.
Параметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса TranscribeRequest
| Поле | Тип | Описание |
|---|---|---|
sources | integer[] | Номера исходников (по умолчанию — все со звуком, где речь ещё не распознана)1–40 |
language | string | Язык речи: auto или двухбуквенный код |
confirmCost | integer | Цена, на которую вы согласны. Без неё ответ — Quote, ничего не запускается |
Запрос
curl -X POST "https://api.slicer.media/v1/projects/42/transcribe" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sources":[1],"language":"ru"}'const response = await fetch('https://api.slicer.media/v1/projects/42/transcribe', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"sources": [
1
],
"language": "ru"
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.post(
"https://api.slicer.media/v1/projects/42/transcribe",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"sources": [1],
"language": "ru",
},
)
body = response.json()Ответ
Один из вариантов: Quote, TranscribeJob
Поля ответа: Quote (8)
| Поле | Тип | Описание |
|---|---|---|
statusобязательное | "quote" | |
costобязательное | integer | Цена в токенах; повторите запрос с confirmCost, равным ей. У операции по себестоимости (atCost) — предельная: спишется фактическая себестоимость, не больше |
freeобязательное | boolean | Операция бесплатна (первый ролик, бесплатный повтор) |
estimate | number | Операция по себестоимости: ожидаемая цена в токенах (дробно) |
atCost | boolean | Цена — себестоимость ИИ-сервисов без наценки: списывается фактическая, не больше cost |
availableобязательное | integer | Сколько токенов доступно сейчас |
enoughобязательное | boolean | Токенов хватает |
spendLimitLeftобязательное | integer | null | Остаток месячного лимита расходов токена; null — без лимита |
Поля ответа: TranscribeJob (5)
| Поле | Тип | Описание |
|---|---|---|
idобязательное | string | |
statusобязательное | string | processing · ready · failed |
sourcesобязательное | integer[] | |
createdAtобязательное | string | |
error | string |
{
"ok": true,
"data": {
"status": "quote",
"cost": 24,
"free": true,
"estimate": 1.5,
"atCost": true,
"available": 240,
"enough": true,
"spendLimitLeft": 200
}
}Задачи распознавания речи
/v1/projects/{id}/transcribeПараметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Запрос
curl "https://api.slicer.media/v1/projects/42/transcribe" \
-H "Authorization: Bearer $SLICER_TOKEN"const response = await fetch('https://api.slicer.media/v1/projects/42/transcribe', {
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
},
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.get(
"https://api.slicer.media/v1/projects/42/transcribe",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()Ответ
{
"ok": true,
"data": [
{
"id": "string",
"status": "processing",
"sources": [
1
],
"createdAt": "2026-10-16T09:30:00Z",
"error": "string"
}
]
}Команда ИИ-помощнику
/v1/projects/{id}/assistantСписывается, только если что-то изменилось. Результат сохраняется.
Параметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса AssistantRequest
| Поле | Тип | Описание |
|---|---|---|
commandобязательное | string | Что поменять, на любом языке≤ 500 |
revобязательное | integer | |
confirmCost | integer | Цена, на которую вы согласны. Без неё ответ — Quote, ничего не запускается |
Запрос
curl -X POST "https://api.slicer.media/v1/projects/42/assistant" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"command":"Сделай субтитры крупнее","rev":7}'const response = await fetch('https://api.slicer.media/v1/projects/42/assistant', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"command": "Сделай субтитры крупнее",
"rev": 7
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.post(
"https://api.slicer.media/v1/projects/42/assistant",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"command": "Сделай субтитры крупнее",
"rev": 7,
},
)
body = response.json()Ответ
Один из вариантов: Quote, AssistantResult
Поля ответа: Quote (8)
| Поле | Тип | Описание |
|---|---|---|
statusобязательное | "quote" | |
costобязательное | integer | Цена в токенах; повторите запрос с confirmCost, равным ей. У операции по себестоимости (atCost) — предельная: спишется фактическая себестоимость, не больше |
freeобязательное | boolean | Операция бесплатна (первый ролик, бесплатный повтор) |
estimate | number | Операция по себестоимости: ожидаемая цена в токенах (дробно) |
atCost | boolean | Цена — себестоимость ИИ-сервисов без наценки: списывается фактическая, не больше cost |
availableобязательное | integer | Сколько токенов доступно сейчас |
enoughобязательное | boolean | Токенов хватает |
spendLimitLeftобязательное | integer | null | Остаток месячного лимита расходов токена; null — без лимита |
Поля ответа: AssistantResult (6)
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
summaryобязательное | string | |
appliedобязательное | integer | |
chargedобязательное | integer | Списано токенов с кошелька (целые) |
costTokens | number | Фактическая себестоимость команды в токенах (дробно); остаток копится у проекта |
durationSecобязательное | number |
{
"ok": true,
"data": {
"status": "quote",
"cost": 24,
"free": true,
"estimate": 1.5,
"atCost": true,
"available": 240,
"enough": true,
"spendLimitLeft": 200
}
}Перевести субтитры
/v1/projects/{id}/translateПараметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса TranslateRequest
| Поле | Тип | Описание |
|---|---|---|
languageобязательное | string | en · es · pt · de · fr · it · pl · tr · id · uk · ru |
revобязательное | integer | |
confirmCost | integer | Цена, на которую вы согласны. Без неё ответ — Quote, ничего не запускается |
Запрос
curl -X POST "https://api.slicer.media/v1/projects/42/translate" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"language":"en","rev":7}'const response = await fetch('https://api.slicer.media/v1/projects/42/translate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"language": "en",
"rev": 7
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.post(
"https://api.slicer.media/v1/projects/42/translate",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"language": "en",
"rev": 7,
},
)
body = response.json()Ответ
Один из вариантов: Quote, TranslateResult
Поля ответа: Quote (8)
| Поле | Тип | Описание |
|---|---|---|
statusобязательное | "quote" | |
costобязательное | integer | Цена в токенах; повторите запрос с confirmCost, равным ей. У операции по себестоимости (atCost) — предельная: спишется фактическая себестоимость, не больше |
freeобязательное | boolean | Операция бесплатна (первый ролик, бесплатный повтор) |
estimate | number | Операция по себестоимости: ожидаемая цена в токенах (дробно) |
atCost | boolean | Цена — себестоимость ИИ-сервисов без наценки: списывается фактическая, не больше cost |
availableобязательное | integer | Сколько токенов доступно сейчас |
enoughобязательное | boolean | Токенов хватает |
spendLimitLeftобязательное | integer | null | Остаток месячного лимита расходов токена; null — без лимита |
Поля ответа: TranslateResult (4)
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
phrasesобязательное | integer | |
chargedобязательное | integer | Списано токенов с кошелька (целые) |
costTokens | number | Фактическая себестоимость перевода в токенах (дробно) |
{
"ok": true,
"data": {
"status": "quote",
"cost": 24,
"free": true,
"estimate": 1.5,
"atCost": true,
"available": 240,
"enough": true,
"spendLimitLeft": 200
}
}Автобаланс и подбор цвета (бесплатно)
/v1/projects/{id}/auto-colorБез ИИ: статистика 10 кадров фрагмента → значения «Настроить» (экспозиция, контраст, насыщенность, баланс белого). Результат применяется и сохраняется.
Параметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса AutoColorRequest
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | Ревизия из GET …/transcript или …/document |
blockIdобязательное | string | Id фрагмента: который поправить (auto) или образец (match)≤ 64 |
modeобязательное | string | auto — выровнять этот фрагмент; match — сделать остальные похожими на него (с его фильтром и LUT)auto · match |
Запрос
curl -X POST "https://api.slicer.media/v1/projects/42/auto-color" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rev":7,"blockId":"string","mode":"auto"}'const response = await fetch('https://api.slicer.media/v1/projects/42/auto-color', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"rev": 7,
"blockId": "string",
"mode": "auto"
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.post(
"https://api.slicer.media/v1/projects/42/auto-color",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"rev": 7,
"blockId": "string",
"mode": "auto",
},
)
body = response.json()Ответ
Поля ответа: AutoColorResult (5)
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
modeобязательное | string | auto · match |
adjustобязательное | Record<string, object> | Новые значения «Настроить» по id фрагмента |
appliedобязательное | integer | |
durationSecобязательное | number |
{
"ok": true,
"data": {
"rev": 7,
"mode": "auto",
"adjust": {},
"applied": 1,
"durationSec": 42.5
}
}Сменить стиль
/v1/projects/{id}/styleПараметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса StyleRequest
| Поле | Тип | Описание |
|---|---|---|
templateId | string | |
fontId | string | |
colorId | string | |
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 | |
params.soundEffects | boolean | |
params.introZoom | boolean |
Запрос
curl -X PATCH "https://api.slicer.media/v1/projects/42/style" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"templateId":"string","fontId":"string"}'const response = await fetch('https://api.slicer.media/v1/projects/42/style', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"templateId": "string",
"fontId": "string"
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.patch(
"https://api.slicer.media/v1/projects/42/style",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"templateId": "string",
"fontId": "string",
},
)
body = response.json()Ответ
Поля ответа: Project (26)
| Поле | Тип | Описание |
|---|---|---|
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 |
{
"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"
}
}Свой режиссёр
Ваш ИИ-агент монтирует ролик сам — бесплатно: бриф с материалом и схемами плана и наблюдений, кадры исходников и приём плана с наблюдениями по кадрам. Правила ИИ-режиссёра Slicer применяются к плану на сервере, в ответе — исправления и замечания. Как этим пользоваться — Свой режиссёр.
Бриф режиссёра для вашего ИИ-ассистента (бесплатно)
/v1/projects/{id}/director/briefМатериал (речь по id слов, паузы, дубли, пожелания), общие советы и схемы плана и наблюдений по кадрам. Ассистент смотрит кадры через sourceFrames и присылает план вместе с тем, что увидел, в submitDirectorPlan — правила режиссёра Slicer работают там, на сервере. Настройки, если переданы, сохраняются в проекте.
Параметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса DirectorBriefRequest
| Поле | Тип | Описание |
|---|---|---|
mode | string | Тип роликаauto · talking · story · product · aesthetic |
pace | string | calm · balanced · dynamic |
effects | string | off · light · bold |
targetDurationSec | integer | null | Длина ролика, с; null — решает режиссёр (до 90 с)10–180 |
hook | boolean | Хук и заголовок в начале |
plaques | boolean | |
emoji | boolean | |
cameraMotion | boolean | Наезды и движение камеры |
Запрос
curl -X POST "https://api.slicer.media/v1/projects/42/director/brief" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"auto","pace":"calm"}'const response = await fetch('https://api.slicer.media/v1/projects/42/director/brief', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"mode": "auto",
"pace": "calm"
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.post(
"https://api.slicer.media/v1/projects/42/director/brief",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"mode": "auto",
"pace": "calm",
},
)
body = response.json()Ответ
Поля ответа: DirectorBrief (15)
| Поле | Тип | Описание |
|---|---|---|
projectIdобязательное | integer | |
revобязательное | integer | |
settingsобязательное | Record<string, object> | |
sourcesобязательное | object[] | |
sources[].indexобязательное | integer | |
sources[].kindобязательное | string | |
sources[].durationSecобязательное | number | |
sources[].fileNameобязательное | string | null | |
sources[].wordsобязательное | integer | |
speechRecognizedобязательное | boolean | |
materialобязательное | string | Материал: исходники, речь по id слов, паузы, дубли, пожелания |
guideобязательное | string[] | Общие советы (правила режиссёра Slicer работают на сервере при приёме плана) |
planSchemaобязательное | Record<string, object> | JSON-схема плана для submitDirectorPlan |
scenesSchemaобязательное | Record<string, object> | JSON-схема того, что вы увидели в кадрах |
nextобязательное | string[] |
{
"ok": true,
"data": {
"projectId": 42,
"rev": 7,
"settings": {},
"sources": [
{
"index": 1,
"kind": "string",
"durationSec": 42.5,
"fileName": "interview.mp4",
"words": 1
}
],
"speechRecognized": true,
"material": "string",
"guide": [
"string"
],
"planSchema": {},
"scenesSchema": {},
"next": [
"string"
]
}
}Кадры исходника (бесплатно)
/v1/projects/{id}/sources/{index}/framesПараметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
indexобязательное | integer |
Параметры запроса
| Поле | Тип | Описание |
|---|---|---|
times | string | |
from | number | |
to | number | |
count | integer | 1–16 |
Запрос
curl "https://api.slicer.media/v1/projects/42/sources/1/frames" \
-H "Authorization: Bearer $SLICER_TOKEN"const response = await fetch('https://api.slicer.media/v1/projects/42/sources/1/frames', {
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
},
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.get(
"https://api.slicer.media/v1/projects/42/sources/1/frames",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()Ответ
Поля ответа: SourceFrames (6)
| Поле | Тип | Описание |
|---|---|---|
sourceIndexобязательное | integer | |
durationSecобязательное | number | |
framesобязательное | object[] | |
frames[].timeобязательное | number | |
frames[].mimeTypeобязательное | "image/jpeg" | |
frames[].dataобязательное | string | JPEG, base64, 512 px по большей стороне |
{
"ok": true,
"data": {
"sourceIndex": 1,
"durationSec": 42.5,
"frames": [
{
"time": 1.5,
"mimeType": "image/jpeg",
"data": "string"
}
]
}
}Применить план режиссёра (бесплатно)
/v1/projects/{id}/director/planК плану на сервере применяются правила режиссёра Slicer (границы слов, дубли, видеоряд по вашим наблюдениям, сдержанность, длительность): план становится документом ролика — новая ревизия, видна в редакторе, — в ответе исправления и замечания. Медиа-карточки по описанию не принимаются (их картинка — платная генерация).
Параметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса DirectorPlanRequest
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | rev из directorBrief или текста ролика |
planобязательное | Record<string, object> | План в схеме DirectorBrief.planSchema |
scenes | Record<string, object>[] | Что вы увидели в кадрах, в схеме DirectorBrief.scenesSchema0–400 |
Запрос
curl -X POST "https://api.slicer.media/v1/projects/42/director/plan" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rev":7,"plan":{}}'const response = await fetch('https://api.slicer.media/v1/projects/42/director/plan', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"rev": 7,
"plan": {}
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.post(
"https://api.slicer.media/v1/projects/42/director/plan",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"rev": 7,
"plan": {},
},
)
body = response.json()Ответ
Поля ответа: DirectorPlanResult (10)
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
durationSecобязательное | number | |
planSegmentsобязательное | integer | |
fragmentsобязательное | integer | |
fixesобязательное | string[] | Что Slicer поправил по своим правилам режиссёра |
issuesобязательное | object[] | Что поправить и прислать план снова |
issues[].codeобязательное | string | |
issues[].segment | integer | |
issues[].messageобязательное | string | |
videoобязательное | string | Получившийся ролик текстом (фрагменты, слова, элементы) — сверьте с замыслом |
{
"ok": true,
"data": {
"rev": 7,
"durationSec": 42.5,
"planSegments": 1,
"fragments": 1,
"fixes": [
"string"
],
"issues": [
{
"code": "string",
"segment": 1,
"message": "string"
}
],
"video": "string"
}
}Документ монтажа
Документ монтажа
/v1/projects/{id}/documentПараметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Запрос
curl "https://api.slicer.media/v1/projects/42/document" \
-H "Authorization: Bearer $SLICER_TOKEN"const response = await fetch('https://api.slicer.media/v1/projects/42/document', {
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
},
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.get(
"https://api.slicer.media/v1/projects/42/document",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()Ответ
Поля ответа: DocumentState (3)
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
durationSecобязательное | number | |
documentобязательное | object | Документ монтажа (EditDocument v1). Внутри v1 поля только добавляются |
{
"ok": true,
"data": {
"rev": 7,
"durationSec": 42.5,
"document": {}
}
}Заменить документ монтажа (для продвинутых)
/v1/projects/{id}/documentПараметры пути
| Поле | Тип | Описание |
|---|---|---|
idобязательное | integer | ≥ 1 |
Тело запроса PutDocumentRequest
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
documentобязательное | object |
Запрос
curl -X PUT "https://api.slicer.media/v1/projects/42/document" \
-H "Authorization: Bearer $SLICER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"rev":7,"document":{}}'const response = await fetch('https://api.slicer.media/v1/projects/42/document', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"rev": 7,
"document": {}
}),
});
const { ok, data, error } = await response.json();import os
import requests
response = requests.put(
"https://api.slicer.media/v1/projects/42/document",
headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
json={
"rev": 7,
"document": {},
},
)
body = response.json()Ответ
Поля ответа: DocumentState (3)
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
durationSecобязательное | number | |
documentобязательное | object | Документ монтажа (EditDocument v1). Внутри v1 поля только добавляются |
{
"ok": true,
"data": {
"rev": 7,
"durationSec": 42.5,
"document": {}
}
}Схемы
Transcript
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | Ревизия документа: передайте её в правки |
durationSecобязательное | number | |
textобязательное | string | Ролик текстом для LLM: фрагменты со словами w<id>, вырезанное — в [скобках], графика |
blocksобязательное | object[] | |
blocks[].idобязательное | string | |
blocks[].positionобязательное | integer | |
blocks[].sourceIndexобязательное | integer | |
blocks[].kindобязательное | string | words · range |
blocks[].wordsобязательное | object[] | |
blocks[].words[].idобязательное | integer | |
blocks[].words[].textобязательное | string | |
blocks[].words[].cutобязательное | boolean | |
blocks[].words[].accentобязательное | boolean | |
elementsобязательное | object | |
elements.hookобязательное | string | null | |
elements.plaquesобязательное | object[] | |
elements.plaques[].idобязательное | string | |
elements.plaques[].kindобязательное | string | |
elements.plaques[].titleобязательное | string | |
elements.plaques[].fromWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.plaques[].toWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.plaques[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.plaques[].end | number | Где элемент заканчивается в ролике, с |
elements.plaques[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.plaques[].anchor.blockIdобязательное | string | |
elements.plaques[].anchor.atобязательное | number | |
elements.plaques[].anchor.durationобязательное | number | |
elements.cardsобязательное | object[] | |
elements.cards[].idобязательное | string | |
elements.cards[].captionобязательное | string | null | |
elements.cards[].fromWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.cards[].toWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.cards[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.cards[].end | number | Где элемент заканчивается в ролике, с |
elements.cards[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.cards[].anchor.blockIdобязательное | string | |
elements.cards[].anchor.atобязательное | number | |
elements.cards[].anchor.durationобязательное | number | |
elements.emojiобязательное | object[] | |
elements.emoji[].idобязательное | string | |
elements.emoji[].emojiобязательное | string | |
elements.emoji[].wordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.emoji[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.emoji[].end | number | Где элемент заканчивается в ролике, с |
elements.emoji[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.emoji[].anchor.blockIdобязательное | string | |
elements.emoji[].anchor.atобязательное | number | |
elements.emoji[].anchor.durationобязательное | number | |
elements.zoomsобязательное | object[] | |
elements.zooms[].idобязательное | string | |
elements.zooms[].fromWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.zooms[].toWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.zooms[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.zooms[].end | number | Где элемент заканчивается в ролике, с |
elements.zooms[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.zooms[].anchor.blockIdобязательное | string | |
elements.zooms[].anchor.atобязательное | number | |
elements.zooms[].anchor.durationобязательное | number | |
elements.titlesобязательное | object[] | Свободные текстовые слои (титры) |
elements.titles[].idобязательное | string | |
elements.titles[].textобязательное | string | |
elements.titles[].fontобязательное | string | |
elements.titles[].sizeобязательное | number | |
elements.titles[].colorобязательное | string | |
elements.titles[].backgroundобязательное | string | none · box · pill |
elements.titles[].backgroundColor | string | |
elements.titles[].outline | boolean | |
elements.titles[].shadow | boolean | |
elements.titles[].alignобязательное | string | left · center · right |
elements.titles[].xобязательное | number | |
elements.titles[].yобязательное | number | |
elements.titles[].animIn | string | fade · slide · pop · typewriter |
elements.titles[].animOut | string | fade · slide · pop |
elements.titles[].fromWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.titles[].toWordIdобязательное | integer | null | Id слова; null — элемент стоит по времени (anchor) |
elements.titles[].start | number | Где элемент начинается в ролике, с; нет — не показывается (его слова вырезаны) |
elements.titles[].end | number | Где элемент заканчивается в ролике, с |
elements.titles[].anchor | object | Привязка ко времени: фрагмент, секунда его исходника и длительность в ролике, с |
elements.titles[].anchor.blockIdобязательное | string | |
elements.titles[].anchor.atобязательное | number | |
elements.titles[].anchor.durationобязательное | number | |
elements.markersобязательное | object[] | Маркеры автора на таймлайне (в ролик не попадают); отрезанные не показываются |
elements.markers[].idобязательное | string | |
elements.markers[].timeобязательное | number | |
elements.markers[].labelобязательное | string | null | |
elements.markers[].colorобязательное | string | cyan · yellow · red · green · violet |
elements.soundsобязательное | object[] | Звуковые эффекты, которые поставил автор; отрезанные не показываются |
elements.sounds[].idобязательное | string | |
elements.sounds[].kindобязательное | string | whoosh · pop · ding · click · swipe · rise · boom · chime |
elements.sounds[].timeобязательное | number |
EditOperation
| Поле | Тип | Описание |
|---|
EditsResult
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
appliedобязательное | integer | |
skippedобязательное | object[] | |
skipped[].indexобязательное | integer | |
skipped[].opобязательное | string | |
skipped[].reasonобязательное | string | |
durationSecобязательное | number |
TranscribeRequest
| Поле | Тип | Описание |
|---|---|---|
sources | integer[] | Номера исходников (по умолчанию — все со звуком, где речь ещё не распознана)1–40 |
language | string | Язык речи: auto или двухбуквенный код |
confirmCost | integer | Цена, на которую вы согласны. Без неё ответ — Quote, ничего не запускается |
TranscribeJob
| Поле | Тип | Описание |
|---|---|---|
idобязательное | string | |
statusобязательное | string | processing · ready · failed |
sourcesобязательное | integer[] | |
createdAtобязательное | string | |
error | string |
AssistantResult
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
summaryобязательное | string | |
appliedобязательное | integer | |
chargedобязательное | integer | Списано токенов с кошелька (целые) |
costTokens | number | Фактическая себестоимость команды в токенах (дробно); остаток копится у проекта |
durationSecобязательное | number |
TranslateResult
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
phrasesобязательное | integer | |
chargedобязательное | integer | Списано токенов с кошелька (целые) |
costTokens | number | Фактическая себестоимость перевода в токенах (дробно) |
StyleRequest
| Поле | Тип | Описание |
|---|---|---|
templateId | string | |
fontId | string | |
colorId | string | |
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 | |
params.soundEffects | boolean | |
params.introZoom | boolean |
DirectorBriefRequest
| Поле | Тип | Описание |
|---|---|---|
mode | string | Тип роликаauto · talking · story · product · aesthetic |
pace | string | calm · balanced · dynamic |
effects | string | off · light · bold |
targetDurationSec | integer | null | Длина ролика, с; null — решает режиссёр (до 90 с)10–180 |
hook | boolean | Хук и заголовок в начале |
plaques | boolean | |
emoji | boolean | |
cameraMotion | boolean | Наезды и движение камеры |
DirectorBrief
| Поле | Тип | Описание |
|---|---|---|
projectIdобязательное | integer | |
revобязательное | integer | |
settingsобязательное | Record<string, object> | |
sourcesобязательное | object[] | |
sources[].indexобязательное | integer | |
sources[].kindобязательное | string | |
sources[].durationSecобязательное | number | |
sources[].fileNameобязательное | string | null | |
sources[].wordsобязательное | integer | |
speechRecognizedобязательное | boolean | |
materialобязательное | string | Материал: исходники, речь по id слов, паузы, дубли, пожелания |
guideобязательное | string[] | Общие советы (правила режиссёра Slicer работают на сервере при приёме плана) |
planSchemaобязательное | Record<string, object> | JSON-схема плана для submitDirectorPlan |
scenesSchemaобязательное | Record<string, object> | JSON-схема того, что вы увидели в кадрах |
nextобязательное | string[] |
SourceFrames
| Поле | Тип | Описание |
|---|---|---|
sourceIndexобязательное | integer | |
durationSecобязательное | number | |
framesобязательное | object[] | |
frames[].timeобязательное | number | |
frames[].mimeTypeобязательное | "image/jpeg" | |
frames[].dataобязательное | string | JPEG, base64, 512 px по большей стороне |
DirectorPlanRequest
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | rev из directorBrief или текста ролика |
planобязательное | Record<string, object> | План в схеме DirectorBrief.planSchema |
scenes | Record<string, object>[] | Что вы увидели в кадрах, в схеме DirectorBrief.scenesSchema0–400 |
DirectorPlanResult
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
durationSecобязательное | number | |
planSegmentsобязательное | integer | |
fragmentsобязательное | integer | |
fixesобязательное | string[] | Что Slicer поправил по своим правилам режиссёра |
issuesобязательное | object[] | Что поправить и прислать план снова |
issues[].codeобязательное | string | |
issues[].segment | integer | |
issues[].messageобязательное | string | |
videoобязательное | string | Получившийся ролик текстом (фрагменты, слова, элементы) — сверьте с замыслом |
DocumentState
| Поле | Тип | Описание |
|---|---|---|
revобязательное | integer | |
durationSecобязательное | number | |
documentобязательное | object | Документ монтажа (EditDocument v1). Внутри v1 поля только добавляются |