К содержанию
Lumean API

Ключ, права и заголовки

X-API-KEY как отдельный контур, одиннадцать предметных прав плюс wildcard, три пресета — и почему «automation» не проходит базовый сценарий целиком.

Публичный API авторизуется одним заголовком и ничем больше. Анонимных ручек в нём нет: каждая операция спеки требует ключа, и почти каждая называет конкретное право в собственном описании. Исключение — каталог AI-моделей: ему подходит любой активный ключ. Страниц справочника на одну меньше, чем операций: PUT и PATCH /templates/{template} схлопнуты в одну (это одна операция под двумя методами), а POST /broadcasting/auth объясняется в разделе Realtime.

X-API-KEY: <ваш ключ>

Отдельный контур, а не второй способ входа

Публичный контур (/api/public/*) и API веб-кабинета — разные поверхности с разной аутентификацией. Bearer-токен кабинета здесь не работает; ключ, наоборот, не открывает ручки кабинета. Заголовок называется ровно X-API-KEY — ни Authorization, ни Api-Key не распознаются, и оба дают тот же ответ, что и полное отсутствие ключа.

401401 — ключ не принят
Что произошло
Запрос отклонён до всякой бизнес-логики: ни одного действия не выполнено, ничего не списано. Тело одинаковое у всех эндпоинтов: `{"success": false, "message": "API key is missing. Provide it in the X-API-KEY header.", "data": null}`. Анонимных запросов публичный контур не принимает нигде.
Что сделать прямо сейчас
Убедиться, что заголовок называется ровно `X-API-KEY` (не `Authorization`, не `Api-Key`) и значение передано целиком. Если ключ верный — открыть раздел разработчика и проверить, что ключ активен и срок не вышел. Повторять запрос бессмысленно: 401 детерминирован, ретрай с тем же ключом даст тот же ответ.
Открыть страницу кода

Ключ хешируется (sha256) и резолвится с кэшем около часа. Практическое следствие: правка прав или деактивация ключа в кабинете применяется не мгновенно — запросы могут ещё какое-то время идти по старому состоянию.

Одиннадцать прав и wildcard

Право проверяется до бизнес-логики: ключ без нужного права получает 403 и ничего не выполняет. Колонка «операций» — сколько ручек публичного API открывает право (страницы справочника плюс POST /broadcasting/auth).

ПравоЧто открываетОпераций
orders.readЧтение заказов и чанков, превью разбиения текста, WebSocket-подписка на заказы9
orders.writeСоздание, отмена и повтор заказов; повтор и перегенерация чанков6
orders.downloadPOST /storage/url — обмен пути файла на временную ссылку1
templates.readЧтение шаблонов, browse, config-options4
templates.writeСоздание, изменение и удаление шаблонов3
voices.readВсе каталоги голосов: LumVoice, ElevenLabs, HeyGen, Cartesia, Fish Audio; свои клоны и их квота14
voices.writeСоздание, повтор и архивирование клонов голоса Cartesia и Fish Audio6
billing.readusage, subscriptions3
profile.readGET /user1
reseller.readКабинет реселлера: профиль и баланс, настройки, статистика, коды с полным значением5
reseller.writeВыпуск подарочных кодов с баланса реселлера и их отмена2
*Проходит любую проверку прав, включая права, которых ещё не существует, — кроме reseller.read и reseller.writeвсе, кроме реселлера

Две операции каталога AI-моделей (GET /ai/models и GET /ai/models/{key}) права не требуют вовсе — в таблице их нет.

Ловушка

Права реселлера * не покрывает и ни в один пресет они не входят: подарочный код — деньги на предъявителя, поэтому ключ получает reseller.read и reseller.write только явным перечислением. Ключ с wildcard на GET /reseller ответит 403.

Ловушка

orders.download не покрывается orders.read. Ключ, который прекрасно читает заказы и видит пути в result.files[], на обмене пути на ссылку получит 403. Это самая частая причина неожиданного отказа в конце сценария — когда файл уже сгенерирован и оплачен.

POST/storage/url

Get File URL

Три пресета

При создании ключа права обычно набираются пресетом.

ПресетПраваНе открывает
read_onlyorders.read, orders.download, templates.read, voices.read, billing.read, profile.readвсё, что пишет заказы, шаблоны и клоны голоса, и кабинет реселлера
automationто же плюс orders.writePOST, PUT/PATCH и DELETE /templates/{template}, создание, повтор и архив клонов, кабинет реселлера
fullвсе права, кроме реселлерских (в том числе templates.write и voices.write)кабинет реселлера

Wildcard * — отдельное значение, а не синоним пресета full: он проходит и те проверки, которых на момент выдачи ключа не существовало (но не права реселлера). Какой из двух способов «дать всё» применяет кабинет при выборе full, источники не уточняют — если это важно, сверьтесь со списком прав уже созданного ключа в кабинете.

Ловушка automation

Пресет с названием «для автоматизации» не содержит templates.write — только templates.read. Это не опечатка в документации и не баг: так он и устроен. По той же логике в нём нет и voices.write: ключу, который клонирует голоса, это право добавляют вручную либо берут full.

Последствие конкретное. Для TTS голос задаётся не полем заказа, а config.tts_settings.voice_id шаблона — значит канонический сценарий начинается с POST /templates. На ключе automation он останавливается на первом же шаге: 403, заказ так и не создан.

Правильно

Для сценария «создать шаблон → заказать TTS» брать пресет full — либо automation и вручную добавить templates.write при создании ключа.

Неправильно

Взять automation, потому что задача называется автоматизацией, и потом искать причину 403 в самом заказе — хотя отказал шаг создания шаблона.

Если шаблон создан заранее (в вебе или другим ключом), automation достаточно: владелец шаблона — аккаунт, а не конкретный ключ. Чужой шаблон при этом не откроется никаким ключом.

403template_access_deniedtemplate_access_denied — нет доступа к шаблону
Что произошло
Доменный отказ создания заказа: HTTP 403, тело `{"success": false, "message": "…", "reason": "template_access_denied"}`. Заказ не создан.
Что сделать прямо сейчас
Проверить, что шаблон виден ключу. Владелец шаблона — аккаунт, а не конкретный ключ: шаблон, созданный в вебе, годится для API и наоборот, а вот чужой шаблон не откроется никаким ключом. Если шаблон свой — дело в правах: `automation` не включает `templates.write`, но `templates.read` в нём есть.
Открыть страницу кода

Заголовки языка и таймзоны

Оба заголовка необязательны и ни один из них не объявлен параметром в OpenAPI — сгенерированный по спеке клиент про них не узнает, отправлять придётся руками.

  • X-Locale — язык человекочитаемых строк: message в ответах и названия в справочниках вроде GET /voices/tags. На машинные поля (reason, статусы, коды) не влияет никак, и ветвиться по message нельзя именно поэтому. Расхождение источников: OpenAPI называет этот заголовок в 79 описаниях и ни разу не упоминает Accept-Language, а справочник для LLM — наоборот; если язык ответа критичен, проверьте фактическое поведение на своём ключе и присылайте оба заголовка.
  • X-Timezone — имя зоны IANA (Europe/Moscow). Моменты времени в ответах приходят в ISO-8601 с явным оффсетом, по умолчанию UTC. Голый оффсет (+03:00) отвергается: он не знает про переход на летнее время. Фактически применённую зону сервер возвращает тем же заголовком — прислав мусор, вы увидите в ответе X-Timezone: UTC.

Что по ключу недоступно

Публичный контур не проводит платежей и не управляет собой. По ключу нельзя: пополнять баланс, делать переводы, покупать подписки, менять профиль и управлять самими API-ключами. Всё это остаётся в кабинете. Отдельно: у заказов нет update/delete — только cancel и retry, а PUT/PATCH/DELETE /orders/{order} ответят 405/404.

Смоук-тест ключа

Самая дешёвая проверка — профиль: одна операция, одно право, никаких побочных эффектов.

curl -s -o /dev/null -w '%{http_code}\n' \
  'https://api.lumean.app/api/public/user' \
  -H 'X-API-KEY: <ваш ключ>'
КодЧто это значит
200Ключ активен, право profile.read есть
403Ключ рабочий — аутентификация прошла, нет только profile.read
401Ключ не принят: не отправлен, обрезан, неизвестен, деактивирован или истёк

Ключевой нюанс — вторая строка: 403 подтверждает, что ключ жив. Если profile.read у вашего ключа нет по замыслу, проверяйте GET /orders?per_page=1 — ей нужен только orders.read.

GET/user

Get profile of API key owner

Ключи создаются в разделе «Разработчикам»: там же видны действующие права и лимиты конкретного ключа. Ключа ещё нет — сначала регистрация, ключи выдаются только владельцу аккаунта.

Скормить страницу ИИ

Открыть .mdllm.md

Обновлено 17.10.2026 · спека 0.0.1