---
title: "POST /templates — Создать шаблон"
url: https://lumean.app/developers/docs/api/post-templates
locale: ru
description: "Создать шаблон"
generated: 2026-11-08
operationId: template.store
method: POST
path: /templates
scopes: [templates.write]
spec_version: 1.0.0
---

# POST /templates

**Создать шаблон**

Создаёт шаблон генерации от имени владельца ключа. В ответе (`201`) приходит готовый
шаблон — его `id` подставляйте в `template_id` при создании заказов.

`config` валидируется по схеме сервиса, указанного в `service_key`. Допустимые ключи,
списки значений и диапазоны берите из `GET /templates/config-options?service=<код>` —
значение вне схемы отклоняется с `422`.

**Требуемое право ключа:** `templates.write`.

- Право ключа: `templates.write`

## Запрос

```bash
curl -X POST 'https://api.lumean.app/api/public/templates' \
  -H 'Accept: application/json' \
  -H 'X-API-KEY: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "service_key": "elevenlabs",
  "name": "Диктор — женский, спокойный",
  "config": {
    "tts_settings": {
      "mode": "mode_v1",
      "model_id": "eleven_multilingual_v2",
      "voice_id": "EXAVITQu4vr4xnSDxMaL",
      "language_code": "ru",
      "advanced_voice_settings": true,
      "voice_settings": {
        "stability": 0.5,
        "similarity_boost": 0.75,
        "use_speaker_boost": true,
        "speed": 1
      }
    }
  }
}'
```

## Параметры

| Поле | Где | Тип | Обяз. | Описание |
| --- | --- | --- | --- | --- |
| `X-Locale` | header | `string` | — | Язык локализованных текстов ответа (`message`, подписи, причины ошибок), код ISO-639-1. Необязателен; без него — язык аккаунта владельца ключа, затем `Accept-Language`, затем язык по умолчанию. Неизвестный или неподдерживаемый код пропускается так же, как отсутствующий. |
| `X-Timezone` | header | `string` | — | IANA-зона (`Europe/Moscow`), в которой ответ показывает моменты времени — ISO-8601 со смещением. Необязателен; без него даты приходят в UTC. Невалидная зона игнорируется. Применённую зону сервер возвращает в одноимённом заголовке ответа. |

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

`config` валидируется по схеме сервиса из `service_key`. Допустимые ключи, списки
значений и диапазоны — в `GET /templates/config-options?service=<код>`; значение
вне схемы отклоняется с `422`.

Content-Type: `application/json`

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `service_key` | `string` | обяз. | Код сервиса, под который создаётся шаблон: короткая латинская строка — `elevenlabs`, `heygen`, `lumimg`, `sfx`, `music`. Доступные вам коды перечисляет `GET /usage` в поле `service_code`; от этого выбора зависит, что примет `config`. |
| `name` | `string` — ≤ 255 симв. | обяз. | Название шаблона, до 255 символов. Видно в `GET /templates` и в интерфейсе. |
| `config` | `object` | обяз. | Настройки генерации. Структура зависит от `service_key`; допустимые ключи, диапазоны и списки значений отдаёт `GET /templates/config-options?service=<код>` — берите их оттуда, а не угадывайте. Минимальный валидный `config` для `elevenlabs`: `{"tts_settings": {"mode": "mode_v1", "model_id": "eleven_multilingual_v2", "voice_id": "<VOICE_ID>", "advanced_voice_settings": true, "voice_settings": {"stability": 0.5, "similarity_boost": 0.75, "use_speaker_boost": true, "speed": 1.0}}}` ### Тонкие настройки голоса включаются флагом Что из `voice_settings` доезжает до движка озвучки, зависит от модели и флага `tts_settings.advanced_voice_settings` (по умолчанию `false`): \| Модель \| Без флага \| С флагом \| \| --- \| --- \| --- \| \| `eleven_v3`, `eleven_v3_beta` \| `stability` \| все пять \| \| `eleven_v4`, `eleven_v4_exp` \| `stability`, `similarity_boost`, `clone_strength` \| все пять + `clone_strength` \| \| остальные \| все пять \| все пять \| Не доехавшие значения сохранятся в шаблоне и пройдут валидацию, но на звук не повлияют. Ошибки не будет: это выглядит как «настройка не работает» — чаще всего со `speed` на v3/v4. Зависимость той же природы есть и у `voice_settings.stability`: на моделях семейства `eleven_v3` шаг равен 0.5, то есть принимаются только `0`, `0.5` и `1`. ### Сшивка просодии между фрагментами Длинный текст режется на фрагменты, и каждый озвучивается своим запросом — поэтому на стыках слышен перепад интонации. Два необязательных булевых флага просят движок учитывать соседей: `tts_settings.prev_next_text` передаёт текст соседних фрагментов, `tts_settings.request_ids` — идентификаторы соседних генераций. Оба по умолчанию `false`. Флаги влияют только на звучание стыков, стоимость и разбиение на фрагменты не меняют. **Включить можно только ОДИН из них.** Оба сразу — `422`: получив и текст, и идентификаторы, движок использует только идентификаторы и текст игнорирует, так что «включено оба» было бы тихо выключенным `prev_next_text`. ### Нормализация текста `tts_settings.apply_text_normalization` — три режима: `auto` (движок сам решает, нужна ли нормализация, например читать ли числа словами), `on` (применять всегда), `off` (пропускать). По умолчанию `auto`. |
| `folder_id` | `string` — uuid — nullable | — | UUID вашей папки. Не передан — шаблон создаётся в корне. |
| `is_public` | `boolean` | — | Опубликовать шаблон в общем каталоге. По умолчанию `false` — шаблон виден только вам. |

**Пример**

```json
{
  "service_key": "elevenlabs",
  "name": "Диктор — женский, спокойный",
  "config": {
    "tts_settings": {
      "mode": "mode_v1",
      "model_id": "eleven_multilingual_v2",
      "voice_id": "EXAVITQu4vr4xnSDxMaL",
      "language_code": "ru",
      "advanced_voice_settings": true,
      "voice_settings": {
        "stability": 0.5,
        "similarity_boost": 0.75,
        "use_speaker_boost": true,
        "speed": 1
      }
    }
  }
}
```

## Сценарии тела

### Шаблон TTS (ElevenLabs)

Минимальный валидный config. Допустимые модели, голоса и диапазоны — GET /templates/config-options?service=elevenlabs.

```json
{
  "service_key": "elevenlabs",
  "name": "Диктор — женский, спокойный",
  "config": {
    "tts_settings": {
      "mode": "mode_v1",
      "model_id": "eleven_multilingual_v2",
      "voice_id": "EXAVITQu4vr4xnSDxMaL",
      "language_code": "ru",
      "advanced_voice_settings": true,
      "voice_settings": {
        "stability": 0.5,
        "similarity_boost": 0.75,
        "use_speaker_boost": true,
        "speed": 1
      }
    }
  }
}
```

## Ответы

### 201 — Шаблон создан. Его `id` подставляйте в `template_id` при создании заказов.

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Признак успеха. Решение принимайте по HTTP-коду: у любого ответа 2xx здесь `true`, а ошибка приходит телом другой формы, где этого поля может не быть вовсе. |
| `message` | `string` | обяз. | Пояснение для человека, на языке аккаунта. Показать пользователю можно; разбирать программно — нет: формулировки меняются без предупреждения и кодом ошибки не являются. |
| `data` | `Template` | обяз. | Созданный шаблон. Его `id` кладут в `template_id` при создании заказа. |
| `data.id` | `string` | обяз. | UUID шаблона. Его кладут в `template_id` при создании заказа. |
| `data.user_id` | `integer` | обяз. | ID владельца шаблона. |
| `data.slug` | `string` | обяз. | Короткий публичный идентификатор для расшаривания. `null` у шаблона, которым не делились. |
| `data.name` | `string` | обяз. | Название шаблона — только для человека, на поведение генерации не влияет. |
| `data.service_key` | `string` | обяз. | Код сервиса, по схеме которого валидируется `config`: `elevenlabs`, `lumimg` и т. д. |
| `data.service` | `Service \| null` — nullable | обяз. | Сервис шаблона справочно: название и тарификация, без схем конфигурации. `null` означает, что сервиса с таким кодом больше нет. |
| `data.config` | `object` | обяз. | Настройки генерации: голос, модель, скорость и прочее — набор ключей задаёт сервис. Допустимые значения смотрите в `GET /templates/config-options?service=<код>`, значение вне схемы отклоняется с `422`. В заказе (`template` в `GET /orders/{order}`) это настройки самого заказа — снимок на момент его создания с `config_override`, а не текущий конфиг шаблона (у заказов, созданных до конца сентября 2026 года, — текущий конфиг шаблона с `config_override`). |
| `data.is_public` | `boolean` | обяз. | Опубликован ли шаблон в общем каталоге. |
| `data.folder_id` | `string` | обяз. | UUID папки, в которой лежит шаблон, либо `null` для корня. Структура папок видна в `GET /templates/browse`. |
| `data.created_at` | `string` — date-time — nullable | обяз. | Когда шаблон создан, ISO 8601. |
| `data.updated_at` | `string` — date-time — nullable | обяз. | Когда шаблон последний раз менялся, ISO 8601. |

**Пример**

```json
{
  "success": true,
  "message": "Template created",
  "data": {
    "id": "3c4d5e6f-7a8b-4c9d-8e0f-1a2b3c4d5e6f",
    "user_id": 501,
    "slug": "2f3a4b5c-6d7e-4f8a-9b0c-1d2e3f4a5b6c",
    "name": "Ad Voice (RU)",
    "service_key": "elevenlabs",
    "config": {
      "tts_settings": {
        "model_id": "eleven_multilingual_v2",
        "voice_id": "pNInz6obpgDQGcFmaJgB",
        "mode": "mode_v1",
        "language_code": "ru",
        "advanced_voice_settings": true,
        "voice_settings": {
          "stability": 0.6,
          "similarity_boost": 0.7,
          "use_speaker_boost": true
        }
      }
    },
    "is_public": false,
    "folder_id": null,
    "created_at": "2026-07-17T15:30:00+00:00",
    "updated_at": "2026-07-17T15:30:00+00:00"
  }
}
```

### 401 — Невалидный или отсутствующий X-API-KEY

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Всегда `false` в ответах об ошибке. |
| `message` | `string` | обяз. | Текст ошибки на языке ключа (задаётся заголовком `X-Locale`). |
| `data` | `null` — nullable | обяз. | Всегда `null`, когда запрос отклонён до обработки. |

**Пример**

```json
{
  "success": false,
  "message": "API key is missing. Provide it in the X-API-KEY header.",
  "data": null
}
```

### 403 — У ключа нет права templates.write

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `success` | `boolean` | обяз. | Всегда `false` в ответах об ошибке. |
| `message` | `string` | обяз. | Текст ошибки на языке ключа (задаётся заголовком `X-Locale`). |

**Пример**

```json
{
  "success": false,
  "message": "This API key does not have permission to perform this action."
}
```

### 422 — Ошибка валидации

**Поля ответа**

| Поле | Тип | Обяз. | Описание |
| --- | --- | --- | --- |
| `message` | `string` | обяз. | Сводка ошибок валидации словами, на языке ответа (`X-Locale`). |
| `errors` | `object` | обяз. | Разбор по полям: ключ — поле запроса, значение — список претензий к нему. |
| `errors.*` | `array<string>` — произвольные ключи | — |  |

**Пример**

```json
{
  "message": "string",
  "errors": {
    "key": [
      "string"
    ]
  }
}
```

---

- Эта же страница в браузере: https://lumean.app/developers/docs/api/post-templates
- Машинный справочник целиком: https://api.lumean.app/docs/llm.md
