# Signailist — полная документация RU
Index: https://docs.signailist.com/llms.txt
OpenAPI: https://docs.signailist.com/openapi.json
This file contains client-facing product and integration documentation only. Internal runbooks, credentials and acceptance payloads are excluded.
---
# Обзор
Canonical page: https://docs.signailist.com/ru/
# Обзор Signailist
Signailist превращает информацию из разных источников в релевантные материалы, дайджесты и публикации. Собирайте публичные ленты и сообщения каналов, передавайте тексты из собственных систем, анализируйте материалы по вашим темам и готовьте результаты для команды или аудитории.
Работайте в приложении, поручайте задачи агенту через MCP или подключайте свою систему через REST API и вебхуки. Все способы используют общее пространство, права доступа, очереди обработки и баланс.
## С чего начать
| Ваша задача | Первые шаги |
| --- | --- |
| Выпускать свой контент по расписанию | [Создайте авторскую рубрику](https://docs.signailist.com/ru/author-first) и управляйте ей в [Автопубликации](https://docs.signailist.com/ru/signals-and-autopublish) |
| Подготовить первый дайджест | [Добавьте источники](https://docs.signailist.com/ru/sources), настройте [AI-анализ по темам](https://docs.signailist.com/ru/ai) и [создайте дайджест](https://docs.signailist.com/ru/digests) |
| Получать еженедельную подборку | Подготовьте первый выпуск, затем настройте [еженедельное расписание](https://docs.signailist.com/ru/signals-and-autopublish#weekly-digest) |
| Следить за релизами, играми или видеоканалами | Выберите GitHub Releases, Steam или YouTube в [Источниках](https://docs.signailist.com/ru/sources) |
| Настроить процесс через агента | [Подключите MCP](https://docs.signailist.com/ru/developers-mcp) и скопируйте [промпт сценария](https://docs.signailist.com/ru/developers-recipes) |
| Передавать собственные материалы и получать результаты | Используйте [приём материалов и вебхуки](https://docs.signailist.com/ru/developers-webhooks), а также [справочник API](https://docs.signailist.com/ru/developers-api) |
| Оценить расходы до запуска | Прочитайте [Баланс и расходы](https://docs.signailist.com/ru/billing) и откройте [калькулятор стоимости](https://signailist.com/ru/pricing#calculator) |
## От источника к результату
```text
Публичные ленты / каналы и чаты Telegram / тексты из вашей системы
↓
Сбор или загрузка → подготовка → AI-анализ по темам
↓
Отбор материалов → дайджест → текст и необязательная обложка
↓
Проверка и утверждение → публикация в Telegram / Discord
↓
Результаты и статусы в приложении, API / MCP и подписанных вебхуках
```
Источник и назначение независимы. Объединяйте материалы из разных источников в одном выпуске, сохраняйте черновик в пространстве, публикуйте его в подключённые каналы или получайте результат для своей системы. Telegram — один из поддерживаемых источников и каналов публикации; также через него доступны уведомления и модерация.
## Возможности
| Этап | Что можно сделать |
| --- | --- |
| Источники | Собирать RSS/Atom, GitHub Releases, новости Steam, записи лент YouTube и сообщения Telegram |
| Собственные материалы | Передавать версии текстовых материалов через приватный источник пространства |
| Анализ | Подготавливать материалы, классифицировать контент и оценивать релевантность по темам с пояснениями |
| Сигналы | Отслеживать связанные события и получать уведомления в Telegram при достижении заданных порогов |
| Дайджесты и шаблоны | Отбирать материалы, задавать тон и структуру, генерировать текст и обложки, редактировать черновики |
| Публикация | Утверждать версию и отправлять её в Telegram, Discord или несколько назначений с отдельными статусами |
| Регулярная работа | Готовить публикации по сигналам или расписанию, управлять утверждением, включением и паузой |
| Интеграции | Настраивать и запускать работу через API-ключи или MCP с ограниченными правами, получать подписанные вебхуки |
| Расходы | Оценивать стоимость, проверять списания и резервы, задавать лимиты пространства и подключений |
Ленты предоставляют материалы, доступные у провайдера. Записи YouTube не включают анализ видео или субтитров. Перед выбором ознакомьтесь с [требованиями и ограничениями источников](https://docs.signailist.com/ru/sources).
## Пространства и доступ
Материалы, настройки и баланс каждого пространства изолированы. Владелец, редактор и наблюдатель имеют разные права. API-ключи и MCP-сессии привязаны к выбранному пространству и не могут превышать текущие права выдавшего доступ пользователя. Публикация требует отдельного разрешения; подключение провайдера и первичная авторизация могут требовать браузера.
## Начните с одного результата
Создайте ручной черновик перед включением регулярных публикаций. [Пример RSS → Discord](https://docs.signailist.com/ru/rss-discord) проводит через подготовку полного выпуска. Если удобнее работать с агентом, используйте [промпт еженедельного дайджеста](https://docs.signailist.com/ru/developers-recipes). Проверьте источники, тему, шаблон, назначение и оценку стоимости, затем включите расписание.
Signailist работает с общим балансом пространства без подписки. Выполненная работа расходует баланс; пополнение выполняется вручную через администратора. Подробнее — [Баланс и расходы](https://docs.signailist.com/ru/billing).
---
# Источники
Canonical page: https://docs.signailist.com/ru/sources
Источник определяет, откуда Signailist получает материалы: публичные ленты, каналы и чаты или ваша система через API. В одном пространстве можно объединять разные источники. Назначение публикации выбирается отдельно от источника.
## Выбор источника
| Источник | Что понадобится | Что собирает Signailist |
| --- | --- | --- |
| Telegram | Подключённый аккаунт с доступом к каналу или чату | Сообщения выбранного канала или чата |
| RSS / Atom | Публичный HTTPS URL ленты | Доступные в ленте записи со ссылками на оригинальные статьи |
| GitHub Releases / Steam / YouTube | Публичный репозиторий, AppID или ID канала | Релизы, новости игр или записи о видео; ограничения описаны ниже |
| Собственная система | API-ключ с правом `ingest` или MCP-подключение | Версии текстовых материалов, отправленные в приватный источник |
Настраивать источники могут владельцы и редакторы пространства. Наблюдатели могут просматривать сохранённые материалы.
## Ленты RSS и Atom {#rss-и-atom}
RSS и Atom — форматы новостных лент сайтов. Укажите адрес самой ленты, а не главной страницы сайта или отдельной статьи. Для обоих форматов используется вариант источника RSS.
Для публичной ленты не нужны ключ API, Telegram-аккаунт или собственный сервер.
1. Откройте **Источники**, выберите RSS и введите публичный HTTPS URL ленты.
2. Сохраните источник. Новый источник создаётся на паузе.
3. Включите сбор и нажмите **Собрать сейчас**. Сбор выполняется в фоне и может занять несколько минут. Проверьте время последнего сбора и сохранённые записи.
4. Свяжите источник с активной темой. Для первых записей нажмите **Подготовить сохранённые записи для AI**. Сохранение начального предпросмотра не запускает AI-анализ и ничего не публикует.
5. Проверьте записи и оценки по темам в ленте, затем используйте их в [дайджесте](https://docs.signailist.com/ru/digests).
Начальный предпросмотр содержит до 20 записей. RSS предоставляет только записи, которые ещё есть в ленте, и не восстанавливает статьи, уже удалённые сайтом из неё. Сохранённая запись содержит ссылку на оригинальную статью и материал, предоставленный лентой: вместо полного текста там может быть анонс.
У нового источника дождитесь первых сохранённых записей перед паузой. Повторное включение продолжает сбор новых записей и не загружает начальную историю заново.
## GitHub Releases, Steam и YouTube
В **Источники → Добавить источник** выберите нужную платформу. Signailist преобразует введённые данные в адрес публичной ленты и покажет его до сохранения. Ключи API и Telegram-аккаунт не нужны.
| Вариант | Что можно ввести | Что собирается |
| --- | --- | --- |
| GitHub Releases | `facebook/react` или `https://github.com/facebook/react` | Опубликованные релизы и заметки к ним; коммиты и задачи не входят в ленту |
| Steam | AppID, например `108600`, или `https://store.steampowered.com/app/108600/` | Новости и объявления об обновлениях из ленты игры; загрузки и установленные версии не отслеживаются |
| YouTube | ID канала, например `UC_x5XG1OV2P6uZZ5FSM9Ttw`, или `https://www.youtube.com/channel/UC_x5XG1OV2P6uZZ5FSM9Ttw` | Названия, описания и превью недавних роликов со ссылками; видео и субтитры не скачиваются |
Для YouTube нужен ID канала `UC…` или ссылка `/channel/…`. Ссылка на отдельный ролик или адрес с `@handle` не принимаются. ID канала можно скопировать через меню «Поделиться» в YouTube. Для каждого варианта также подходит готовый адрес ленты.
Если сбор YouTube завершается ошибкой, откройте адрес ленты и проверьте её доступность. При временной недоступности повторите сбор позже.
Если лента YouTube возвращает 404, Signailist пробует публичную вкладку **Видео** канала. В этом режиме доступны название, превью и ссылка на ролик; описания может не быть. Shorts и архивы трансляций отдельно не собираются. Если точное время публикации недоступно, запись получает время обнаружения. Если недоступна и публичная страница, сбор сообщает об ошибке; его можно повторить позже.
После сохранения включите сбор, соберите записи, свяжите тему и подготовьте сохранённые записи для AI, как описано выше. Все три варианта используют общий сбор лент, анализ по темам, редактор дайджеста и выбор каналов публикации. Новые источники создаются на паузе. Повторное добавление той же ленты использует существующий источник.
Доступность и глубина истории зависят от публичной ленты: собираются только записи, которые в ней ещё есть. Приватные репозитории и закрытые материалы эти варианты не поддерживают.
Названия YouTube-каналов и Steam-игр подставляются автоматически, если доступны. Название, заданное вами, сохраняется. Если получить имя не удалось, временно показывается ID канала или игры; следующий успешный сбор может обновить его.
Сбор, получение названий и сохранение записей расходуют баланс пространства, даже если сама лента бесплатная. Подробнее — [Баланс и расходы](https://docs.signailist.com/ru/billing).
## Telegram-каналы и чаты
1. Подключите Telegram-аккаунт и включите для него роль сбора. Подробнее — в разделе [Интеграция с Telegram](https://docs.signailist.com/ru/telegram).
2. Откройте **Источники**, выберите Telegram и добавьте публичный канал по имени пользователя либо выберите канал или чат, доступный подключённому аккаунту.
3. Включите сбор и проверьте сохранённые сообщения в ленте.
4. Свяжите источник с активной темой, чтобы оценивать новые материалы по вашим интересам.
Для приватных каналов и чатов подключённый аккаунт уже должен иметь доступ.
## Собственные материалы через API или MCP
Создайте приватный источник `external` и передавайте текстовые материалы по одному или пакетами. У каждого материала есть внешний идентификатор, версия, заголовок, текст и время публикации. Повтор той же версии не создаёт новое задание или повторное списание за приём; изменённый текст требует новой версии.
Этот источник получает данные от вашей системы и не опрашивает её по расписанию. Сохранённые материалы проходят общий процесс обработки и становятся доступны для анализа и дайджестов. Проверяйте задания и готовность AI отдельно от квитанции приёма. Контракт и примеры — в [руководстве по приёму и вебхукам](https://docs.signailist.com/ru/developers-webhooks).
## Анализ и дайджесты
Собранные и загруженные через API материалы проходят общий сценарий оценки по темам и подготовки дайджеста. В один выпуск можно включать обработанные материалы из разных источников. AI-анализ и генерация используют настройки и баланс выбранного пространства. Подробнее — в разделе [AI](https://docs.signailist.com/ru/ai).
Каналы публикации выбираются позже, во вкладке **Публикация** редактора дайджеста. Подробнее — в разделе [Каналы доставки](https://docs.signailist.com/ru/delivery).
## Пауза сбора
Приостановите источник, чтобы прекратить сбор новых материалов. Сохранённые материалы останутся доступны. Сбор источников и расписание выпусков управляются отдельно: пауза расписания не останавливает сбор.
---
# Интеграция с Telegram
Canonical page: https://docs.signailist.com/ru/telegram
# Интеграция с Telegram
## Обзор
Telegram подключается по необходимости: для сбора сообщений, публикаций в его каналах, уведомлений или модерации. Для публичных лент, загрузки собственных материалов и публикации в Discord предусмотрены отдельные способы подключения.
Telegram можно использовать как [источник новостей](https://docs.signailist.com/ru/sources), [канал публикации](https://docs.signailist.com/ru/delivery), а также для уведомлений и модерации:
1. **Сбора новостей** из каналов и чатов.
2. **Доставки сигналов** при обнаружении горячих событий.
3. **Модерации автопубликаций** через карточки approve/reject.
4. **Публикации** утвержденного контента в целевые каналы.
## Подключение аккаунта
Для работы с Telegram workspace подключает аккаунт через MTProto-авторизацию. Один и тот же Telegram-аккаунт можно привязать к нескольким workspace, и эти сессии не конфликтуют.
## Роли для сбора и публикации
Telegram-аккаунт может использоваться в двух ролях:
- **Сбор**: чтение сообщений из настроенных источников.
- **Публикация**: отправка утвержденного контента в целевые каналы.
Роли можно включать независимо или совмещать на одном аккаунте.
## Источники
Telegram-источник — это канал или чат, который отслеживает Signailist. Другой вариант источника — публичная RSS/Atom-лента; подробнее в разделе [Источники](https://docs.signailist.com/ru/sources).
- **Типы**: канал или чат.
- **Видимость**: публичный по username или приватный через список диалогов подключенного аккаунта.
- **Режим сбора**: автоматический сбор по расписанию и ручной запуск из интерфейса.
## Модерация автопубликаций
Модерация автопубликаций работает через Telegram-бота. Когда сигнал создает черновик публикации, карточка модерации отправляется в назначенный чат модератора, чтобы reviewer мог утвердить или отклонить материал, не выходя из Telegram.
## Telegram в основных сценариях
| Сценарий | Что делает Telegram |
| --- | --- |
| Подключение аккаунта | Авторизует workspace-сессию |
| Загрузка диалогов | Дает список доступных чатов и каналов |
| Сбор сообщений | Читает историю сообщений из выбранных источников |
| Доставка сигнала | Отправляет алерты в Telegram-чаты |
| Модерация автопубликации | Отправляет карточки модерации и принимает решение модератора |
| Публикация в канал | Доставляет утвержденный контент в целевой канал |
## Ограничения
- Приватные каналы нельзя подключить автоматически. У подключенного аккаунта уже должен быть к ним доступ.
- Если достигнуты лимиты Telegram API, сбор приостанавливается и возобновляется позже автоматически.
- Для уведомлений о сигналах и карточек модерации настройте подключение Telegram-бота и чат модератора.
- Если сессия аккаунта истекла или отозвана, переподключите аккаунт для продолжения сбора или публикаций.
---
# AI
Canonical page: https://docs.signailist.com/ru/ai
# AI в Signailist
## Обзор
AI используется в четырех основных сценариях:
1. **Оценка релевантности** новостей по темам workspace.
2. **Генерация текста** для дайджестов и черновиков публикаций.
3. **Генерация шаблонов** из Telegram-источников через извлечение стиля.
4. **Генерация изображений** для обложек дайджестов и связанных материалов.
AI-анализ и генерация используют баланс выбранного пространства. Собственный ключ API OpenAI не нужен.
Сбор источников и публикации тоже расходуют баланс пространства. Подробнее — [Баланс и расходы](https://docs.signailist.com/ru/billing).
## 1. AI-скоринг по темам
### Как работает скоринг
Каждая тема задается как AI-first профиль интереса:
- **Что искать**: обычное текстовое описание релевантного контента.
- **Что исключать**: обычное текстовое описание того, что считать нерелевантным.
Каждая входящая новость оценивается по каждой активной теме с результатом:
- **Релевантность**: соответствует ли материал теме.
- **Score**: значение от 0 до 1.
- **Уверенность**: насколько модель уверена в ответе.
- **Причина**: краткое объяснение решения.
### Настройки скоринга
На уровне workspace можно настроить:
- Модель AI для оценки релевантности.
- Лимит запросов в минуту.
- Параллельность обработки.
Если материал уже был оценен по той же теме, повторный скоринг автоматически пропускается.
## 2. Генерация текста дайджестов
### Как это работает
1. Пользователь выбирает кандидатов и шаблон.
2. AI генерирует текст дайджеста по выбранным материалам.
3. Пользователь просматривает, редактирует и утверждает результат.
4. Во вкладке **Публикация** подготовьте и подтвердите сохранённую версию, затем выберите Telegram, Discord или несколько назначений. Форматирование и ограничения длины зависят от сервиса. Подробнее — [Каналы доставки](https://docs.signailist.com/ru/delivery).
Материалы поддерживаемых источников и внешней загрузки используют общий AI-отбор по темам и генерацию дайджестов. Первые сохранённые записи ленты нужно отдельно подготовить для AI. См. [Источники](https://docs.signailist.com/ru/sources).
Полный сценарий описан в [Дайджестах](https://docs.signailist.com/ru/digests).
## 3. Генерация шаблона из источника
### Как это работает
Тон и структуру шаблона можно задать самостоятельно без подключения Telegram. Извлечение стиля из Telegram-источника — дополнительный способ создать шаблон. Подробнее — [Дайджесты](https://docs.signailist.com/ru/digests).
Генерация шаблона анализирует существующий Telegram-источник и строит переиспользуемый шаблон на основе его тона и структуры.
1. Пользователь выбирает источник и окно выборки.
2. AI анализирует тон, структуру и паттерны письма.
3. На основе этого создается шаблон со стилевыми настройками.
4. Для проверки качества можно сгенерировать тестовые посты.
### Генерация шаблонов
Генерация шаблонов анализирует посты источника, создаёт style profile и опциональные тестовые посты для проверки качества.
## 4. Генерация изображений
### Как это работает
Для дайджеста Signailist может сгенерировать обложку:
1. AI строит image prompt на основе контента дайджеста и настроек шаблона.
2. Изображение генерируется с помощью модели, выбранной в шаблоне.
### Настройки изображений
Для каждого digest template можно задать:
- включена ли генерация изображений;
- базовый image prompt;
- предпочтительный размер или aspect;
- reference images.
## Ограничения
- Для AI-анализа и генерации нужен достаточный баланс выбранного пространства.
- Модели можно настраивать на уровне workspace для скоринга и на уровне шаблона для генерации.
- Для создания обложки включите генерацию изображений в шаблоне и выберите модель изображений.
---
# Баланс и расходы
Canonical page: https://docs.signailist.com/ru/billing
В Signailist нет подписки: выполненная работа оплачивается с общего баланса выбранного пространства независимо от запуска через приложение, MCP или API. Пополнение выполняется вручную через администратора. Доступ к источнику может быть бесплатным, но сбор, сохранение, анализ и публикация материалов используют ресурсы сервиса.
## Оцените расходы перед запуском
Откройте [калькулятор стоимости](https://signailist.com/ru/pricing#calculator) перед сбором источников, AI, публикацией или вебхуками. Выберите объём работы на 30 дней и модели, чтобы увидеть оценку по этапам. В биллинге приложения есть ссылка на этот же калькулятор. Это оценка для планирования, а не подписка, финансовый лимит или резерв; фактические списания зависят от длины текстов, общего сбора источников и попыток доставки.
Агенту достаточно передать [ссылку на страницу стоимости](https://signailist.com/ru/pricing). В её HTML доступны ссылки на [инструкцию расчёта](https://signailist.com/ru/pricing.md) и [публичный JSON-каталог](https://signailist.com/usage-prices.json): конечные цены, ограничения входных параметров, формулы этапов, примеры объёмов и результаты. В инструкции есть готовый пример Python. Вход и выполнение JavaScript не требуются. Попросите агента назвать допущения и исключённые расходы; перед настоящим запуском используйте оценки API/MCP и проверку бюджета workspace.
## На что расходуется баланс
- Сбор Telegram, RSS/Atom, GitHub Releases, Steam и YouTube, включая проверки, при которых новых записей нет.
- Получение названия YouTube-канала или Steam-игры при добавлении источника, даже если новый источник создаётся на паузе.
- Приём и сохранение версий материалов из ваших систем, а также фактические попытки доставки исходящих вебхуков.
- Сохранение записей лент, подготовка материалов, AI-оценка по темам и генерация текста или изображений.
- Публикация в выбранные Telegram- и Discord-каналы. Доставка в каждый канал учитывается отдельно.
Для одного результата внешний сервис может потребовать несколько запросов. Запросы, завершившиеся ошибкой, тоже расходуют ресурсы. Если доставка не подтверждена, перед повтором проверьте канал: публикация могла уже появиться.
Если публичная лента собирается один раз для нескольких пространств, расходы общего сбора распределяются между участвующими пространствами. Персональная AI-обработка, сохранение материалов и доставка учитываются отдельно.
## Когда баланс заканчивается
Для нового сбора, получения названий, AI и публикации нужен положительный баланс пространства. Поэтому добавление источника с получением названия может потребовать баланса ещё до включения сбора.
Сохранённые материалы и баланс остаются доступны для просмотра; источники можно поставить на паузу. Само открытие страниц приложения не создаёт списаний. После пополнения проверьте, что нужные источники и расписания включены.
## Как проверить расходы
Откройте **Настройки пространства → Биллинг**: там доступны баланс, группы расходов и история операций. Стоимость небольшой операции может быть меньше округлённой суммы в сводке. Расчёт включает оценку инфраструктурных расходов и не является копией счёта внешнего провайдера.
Пауза источника прекращает будущий сбор. Уже начатая работа, AI-задачи и расписания публикаций управляются отдельно.
В группе **«Сбор источников»** объединены сбор Telegram и лент, определение названий и сохранение записей лент. В истории можно сочетать **тип операции**, **платформу** (Telegram, RSS/Atom, GitHub Releases, Steam или YouTube) и **конкретный источник**. Эти фильтры меняют историю; баланс и карточки расходов сохраняют итоги выбранного периода. Переключатель **«Показывать точные суммы»** раскрывает небольшие списания полностью.
## API, MCP и вебхуки
Интеграции используют общий баланс workspace. Приём внешних материалов и физические попытки доставки вебхуков учитываются отдельными операциями; дополнительной комиссии за MCP нет. В настройках интеграций резерв и доступная сумма показаны отдельно. Суточные лимиты workspace и подключения используют UTC. Чтение, пауза и отзыв доступа остаются доступны без баланса. Подробности о стоимости, повторах и проверке прерванных резервов — в [документации для разработчиков](https://docs.signailist.com/ru/developers).
---
# Дайджесты
Canonical page: https://docs.signailist.com/ru/digests
# Дайджесты
## Обзор
Дайджест — это итоговая подборка новостей за выбранный период с AI-assisted финальным текстом. Базовый flow такой: выбрать кандидатов, создать дайджест, сгенерировать текст, вручную отредактировать, утвердить и при необходимости опубликовать.
## Flow
```text
Кандидаты (обработанные новости + AI-скоры)
-> пользователь выбирает новости и шаблон
-> создание дайджеста
-> AI-генерация текста
-> ревью и редактирование
-> approve
-> опциональная публикация
```
## Кандидаты
Кандидатами могут быть обработанные материалы подключённых источников и тексты, переданные через API. Их можно объединять в одном выпуске. Подробнее — [Источники](https://docs.signailist.com/ru/sources).
Кандидаты для дайджеста формируются из обработанных новостей. Отбор учитывает workspace-правила, например:
- максимальное количество материалов с одного источника;
- максимальное количество материалов в целом;
- минимальный score для включения;
- исключение приватных цитат;
- максимальный возраст новости.
При запросе кандидатов пользователь может также задать временное окно и переопределить минимальный score для конкретного запроса.
Если AI-скоринг включен, каждый кандидат получает дополнительные данные о релевантности по темам workspace.
## Шаблоны
Шаблон дайджеста определяет тон, структуру и ограничения финального результата.
### Базовые настройки
- **Название шаблона**.
- **Тон**: инструкция по стилю, например формально, кратко, без эмодзи.
- **Формат текста**: render template для генерации.
- **Модель**: модель AI для генерации текста.
### Расширенные настройки
- style profile;
- output modes;
- formatting rules;
- prompt blueprints;
- generation constraints.
### Генерация шаблона из источника
Шаблон можно автоматически построить на основе стиля существующего Telegram-источника. Подробнее см. [AI](https://docs.signailist.com/ru/ai).
### Изображения
Шаблон дайджеста также может управлять поведением изображений:
- включение или отключение генерации обложки;
- базовый image prompt;
- размер или aspect;
- reference images.
## Создание и генерация дайджеста {#create-and-generate-a-digest}
1. Откройте создание дайджеста и выберите временное окно.
2. Загрузите кандидатов и отметьте материалы для включения.
3. Выберите шаблон и запустите генерацию.
4. Просмотрите AI-результат и отредактируйте его при необходимости.
5. Подтвердите результат после проверки.
Перед публикацией проверьте, как дайджест будет выглядеть в выбранном канале.
## Публикация
В редакторе используются вкладки **Текст**, **Изображение**, **Источники** и **Публикация**. Сначала подготовьте содержимое, затем проверьте и подтвердите версию публикации. В конце выберите один или несколько каналов Telegram и Discord и общее время отправки. Статус доставки отслеживается отдельно для каждого канала. Подключение каналов, отложенная отправка и статусы описаны в разделе [Каналы доставки](https://docs.signailist.com/ru/delivery).
Первый черновик можно создать и редактировать без канала публикации. Для регулярных выпусков настройте отдельную схему в разделе «Автопубликация»: [еженедельный дайджест](https://docs.signailist.com/ru/signals-and-autopublish#weekly-digest). Схема требует канал и подтверждение перед отправкой; создание ручного дайджеста само по себе расписание не включает.
## Промо-изображения
Signailist также поддерживает генерацию промо-изображений для контента, связанного с дайджестами. К базовому изображению можно добавить текст и бейджи.
---
# Каналы доставки
Canonical page: https://docs.signailist.com/ru/delivery
Каналы доставки — это место, куда вы публикуете подготовленный материал. Дайджест может объединять материалы любых поддерживаемых источников, а отправить его можно в Telegram, Discord или несколько каналов сразу. Для получения результатов в своей системе используйте [API и исходящие вебхуки](https://docs.signailist.com/ru/developers-webhooks); они настраиваются отдельно от каналов публикации.
## Подключение канала
Откройте **Каналы доставки** и выберите нужный сервис. Вкладки Telegram и Discord здесь разделяют настройки подключений; каналы для конкретной публикации выбираются в редакторе дайджеста.
### Telegram
1. Подключите Telegram-аккаунт и включите роль публикации. Подробнее — в разделе [Интеграция с Telegram](https://docs.signailist.com/ru/telegram).
2. Синхронизируйте его каналы в **Каналы доставки → Telegram**.
3. Проверьте назначение и выбранный аккаунт публикации. У аккаунта должны быть права отправки сообщений в этот канал.
Аккаунт для сбора материалов и аккаунт для публикации могут отличаться.
### Discord
Понадобится URL вебхука канала Discord, которым вы управляете. Telegram-аккаунт для публикации в Discord не нужен.
1. Откройте **Каналы доставки → Discord**.
2. Введите название назначения и URL вебхука, затем сохраните.
3. Для проверки нажмите **Отправить помеченное тестовое сообщение**. В канал придёт «Signailist test delivery». Само сохранение подключения ничего не отправляет.
Храните URL вебхука в секрете: он позволяет отправлять сообщения в канал. Signailist хранит его зашифрованным. Не вставляйте его в адрес источника, инструкции для темы или название сценария.
У сохранённого подключения поле URL скрыто точками и недоступно для редактирования. Нажмите **Изменить URL**, чтобы ввести обновлённый адрес того же вебхука. Другой вебхук добавьте как новое назначение. Отзыв подключения удаляет сохранённый URL и отключает связанные назначения.
## Публикация дайджеста
1. Подготовьте материал во вкладках **Текст**, **Изображение** и **Источники**.
2. Перейдите в **Публикацию** и проверьте сохранённый предпросмотр. Если содержимое изменилось, подготовьте новую версию публикации.
3. Подтвердите версию, которую хотите отправить.
4. Отметьте одно или несколько назначений. Можно выбрать каналы Telegram и Discord вместе. Для Telegram выберите аккаунт публикации или используйте аккаунты из настроек каналов. В списке доступны только включённые аккаунты с разрешением на публикацию; у аккаунта должны быть права отправки в выбранные каналы.
5. Выберите **Сейчас** или будущее время отправки и отправьте в выбранные каналы.
Во все отмеченные каналы отправляется одна подтверждённая версия. Для них задаётся общее время отправки; каждый сервис обрабатывает доставку отдельно, поэтому сообщения могут прийти с небольшой разницей. Форматирование и ограничения длины сообщений зависят от сервиса.
Редактирование дайджеста не меняет версию, уже поставленную в очередь. При необходимости отмените ожидающую доставку, затем подготовьте и подтвердите новую версию. Выбор каналов для ручной публикации не включает регулярное расписание.
Если отправка приостановлена, можно продолжить редактирование и проверку дайджеста, но отправить его нельзя. Альтернативной формы отправки нет. Выбранный Telegram-аккаунт сохраняется в задании доставки: последующее изменение настроек канала не меняет эту отправку.
## Проверка доставки
У каждого назначения свой статус и подробности доставки:
- **В очереди / Отправка / Ожидание повтора**: доставка ещё выполняется.
- **Доставлено**: сервис принял сообщение. Саму публикацию можно посмотреть в канале назначения.
- **Ошибка**: проверьте назначение и следуйте подсказке рядом с ошибкой.
- **Результат неизвестен**: сервис мог принять сообщение без подтверждения. Проверьте канал перед повторной попыткой, чтобы не создать дубликат.
- **Часть сообщения доставлена**: некоторые части уже отправлены. Проверьте канал и подробности доставки перед повторной отправкой.
Результат одного канала не подтверждает доставку в другой. Сохранённые подробности доступны после обновления страницы. Ожидающие отправки можно отменить в истории публикации.
## Регулярные публикации и уведомления
Правила регулярных дайджестов настраиваются отдельно в разделе [Сигналы и автопубликация](https://docs.signailist.com/ru/signals-and-autopublish#weekly-digest). У правила своё назначение и расписание; оно не наследует каналы, выбранные для ручной отправки.
Уведомления о сигналах и карточки модерации Telegram имеют отдельные настройки. Подключение Discord для публикаций не перенаправляет в него эти уведомления.
---
# Сигналы и автопубликация
Canonical page: https://docs.signailist.com/ru/signals-and-autopublish
# Сигналы и автопубликация
## Единый центр автоматизаций
[Автопубликация](https://app.signailist.com/autopublish) управляет авторскими рубриками и новостными правилами, включая созданные через MCP или REST. В обзоре видны действующие состояния, настоящий ближайший запуск с часовым поясом, каналы и последние результаты. «Рубрики и правила» показывает оба типа, «Очередь» — их собственные этапы подготовки, проверки и доставки, «История» — результаты отдельно по каналам и ссылки на опубликованные сообщения.
| Тип | Материалы | Отправка |
| --- | --- | --- |
| Авторская рубрика | Ваш API или ручной каталог | Автоматически либо после проверки каждого выпуска |
| Новостное правило | Собранные и обработанные новости | Подтверждение редактора в Telegram, на сайте или обоими способами |
Начните с [Первой авторской рубрики](https://docs.signailist.com/ru/author-first), [Настройки из MCP](https://docs.signailist.com/ru/author-mcp) или [Восстановления](https://docs.signailist.com/ru/author-recovery). Каталоги вынесены в отдельные [Материалы](https://app.signailist.com/author/materials). Подтверждение в описанном ниже новостном потоке не требуется авторским рубрикам, явно включённым в режиме автоматической отправки.
## Обзор
Сигналы уведомляют о горячих событиях. Новостные правила готовят публикации двумя способами: по срабатыванию сигнала или по ежедневному, еженедельному либо ежемесячному расписанию. В обоих случаях материал проходит подтверждение перед отправкой в выбранный канал.
## Сигналы
### Как работает сигнал
```text
Обработанные новости -> кластеризация событий -> оценка hotness -> проверка порогов -> алерт в Telegram
```
1. **Кластеризация** объединяет связанные новости в события.
2. **Hotness** оценивает событие по числу источников, скорости роста, свежести и AI-релевантности.
3. **Триггеры** сравнивают событие с правилами каждой подписки.
4. **Доставка** отправляет алерт в Telegram, когда правило выполнено.
### Подписка на сигнал
Пользователь создает подписку на тему с условиями, например:
- **Тема**: какую область интереса отслеживать.
- **Минимальная hotness**: порог, после которого нужен алерт.
- **Минимум источников**: сколько разных источников должны подтвердить событие.
- **Cooldown**: пауза между алертами.
- **Telegram-чат**: куда доставлять уведомления.
### Follow-up alerts
Signailist может отправить follow-up alert, если то же событие заметно выросло после первого уведомления, например получило более высокий score или больше подтверждающих источников.
### DND (Do Not Disturb)
- Настраиваемые quiet hours с началом, концом и часовым поясом.
- Алерты, попавшие в окно DND, можно отложить до окончания quiet period.
- Отложенные алерты можно позже отправить или пометить как прочитанные без отправки.
## Новостная автопубликация
### Принцип
В режиме **Сигнал** схема подписывается на существующий сигнал и использует его пороги. В режиме **Расписание** схема отбирает обработанные новости по теме и минимальной оценке в заданное время; подписка на сигнал не нужна.
### Flow
```text
Сигнал сработал
-> создается черновик публикации
-> запускается генерация текста и или изображения
-> отправляется карточка модерации
-> модератор approve или reject
-> утвержденный материал публикуется в целевой канал
```
### Правило автопубликации
Правило автопубликации определяет:
- какой сигнал или расписание его запускает;
- какой шаблон используется;
- в какой целевой канал публиковать;
- какой путь модерации включен: Telegram, web UI или оба;
- какие артефакты генерировать: текст, изображение или оба;
- активно ли правило сейчас.
### Модерация
- Карточки модерации отправляются назначенным reviewer'ам.
- Reviewer может approve или reject через Telegram или web UI.
- Все действия фиксируются в продуктовом workflow.
## Еженедельный дайджест {#weekly-digest}
Перед настройкой расписания создайте и проверьте [ручной дайджест](https://docs.signailist.com/ru/digests#create-and-generate-a-digest). Нужны включённые источники со связью с активной темой (и аккаунт для сбора Telegram-источников), обработанные новости, включённый шаблон и достаточный баланс workspace. Канал, по которому извлечён стиль текста, не становится источником новостей автоматически.
1. В разделе [Автопубликация](https://app.signailist.com/autopublish) создайте схему и выберите **Режим запуска → Расписание**.
2. Укажите **Название схемы**, выберите **Тему новостей** и **Минимальный балл новости**.
3. Выберите **Периодичность → Дни недели**, день, **Время** и **Timezone**. Например, понедельник в 09:00, `Asia/Tbilisi`. Расписание использует пояс из формы — проверьте его даже после автоматического заполнения браузером.
4. Выберите включённый **Шаблон генерации** и **назначение публикации** в Telegram или Discord. Если список пуст, настройте его в разделе [Каналы доставки](https://docs.signailist.com/ru/delivery); для Telegram также нужен аккаунт публикации.
5. Выберите **Подтверждение** на сайте, в Telegram или обоими способами. Для подтверждения в Telegram выберите подключённый чат модерации. Для Discord используется подтверждение на сайте. Включите генерацию текста; изображение добавляйте при необходимости.
6. Проверьте **Включить сразу** перед сохранением. Пока готовите настройки, оставьте схему выключенной; включите её, когда всё готово. Новая схема Discord сохраняется на паузе; включить её можно после сохранения. Проверьте следующий запуск в сохранённой схеме.
7. После запуска откройте материал на проверку, прочитайте текст и источники, при необходимости отредактируйте и подтвердите публикацию.
Первый еженедельный запуск смотрит на семь дней назад. Следующие отборы начинаются с предыдущего обработанного запуска и заканчиваются временем запланированного запуска. В дайджест попадает до 30 подходящих материалов. Если отбор пуст или все материалы уже публиковались и исключены проверкой дублей, кандидат не создаётся, но граница отбора сдвигается. Этот период отличается от периода ручного дайджеста.
**Регулярный новостной черновик без канала публикации пока недоступен.** Для первого черновика без настройки доставки используйте ручное создание дайджеста. Расписание запускает подготовку, а отправка требует проверки и подтверждения.
### Если материал не появился
Проверьте, что схема включена, время и пояс выбраны верно, в workspace есть баланс, источники работают (для Telegram — также аккаунт сбора). Проверьте связь темы с источниками, даты обработанных новостей, минимальную оценку и исключение опубликованных дублей. Перед повтором проверьте ожидающие и неудачные генерации в [Очереди задач](https://app.signailist.com/jobs). Не рассчитывайте, что после паузы или сбоя автоматически появится отдельный выпуск за каждый пропущенный период.
## Режимы публикации
Схема одиночной новости готовит один подходящий материал, схема дайджеста — подборку. Оба режима используют проверку и подтверждение перед отправкой в настроенный канал Telegram или Discord. Схема выбирает одно назначение; ручная публикация в редакторе дайджеста позволяет выбрать несколько.
---
# "Первая авторская рубрика: от материалов до публикации"
Canonical page: https://docs.signailist.com/ru/author-first
**Авторская рубрика** создаёт новые выпуски из вашего каталога. **Новостное правило** выбирает уже собранные и обработанные новости. Оба типа видны в [Автопубликации](https://app.signailist.com/autopublish), но сохраняют собственные состояния генерации, проверки и доставки.
## 1. Материалы
Откройте **Автопубликация → Создать авторскую рубрику** и выберите существующий каталог. Для нового нажмите **Открыть материалы и добавить каталог**. Каталог находится на отдельном экране: ради расписания больше не нужно пролистывать все объекты.
- **API-каталог:** укажите название, HTTPS-адрес каталога и при необходимости токен. Токен хранится на сервере и не передаётся моделям. Подключите каталог, синхронизируйте и проверьте объекты с изображениями.
- **Ручной каталог:** создайте каталог, добавьте ID, названия, описания и переводы объектов. Загрузите изображения и укажите коллекцию для каждого. Сохраните объекты до возвращения в рубрику.
Нажмите **Использовать каталог в рубрике**, чтобы вернуться с выбранным каталогом. Объекты API-каталога доступны для просмотра: редактировать их нужно в исходной системе.
## 2. Содержание
Задайте название рубрики и авторскую инструкцию. Выберите число объектов, способ отбора и количество предыдущих выпусков, из которых не нужно повторять объекты. Выбор фиксируется при запуске выпуска: повтор того же запроса не вытягивает новый набор.
В **Дополнительно** находятся фиксированные заголовки, роли выбранных объектов и обязательные секции. Число ролей должно совпадать с числом объектов. Секции имеют уникальные ID и названия на каждом языке. Свёрнутые настройки при сохранении не удаляются.
## 3. Оформление
Выберите общий стиль текста или оставьте отдельные стили версий. Замена общего стиля применяется ко всем вариантам. Настройте исходную картинку, альбом, новую AI-картинку или выпуск без изображения. Генерация получает настоящие изображения выбранных объектов и дополнительные референсы стиля. Поддерживаемые модели принимают **не больше трёх референсов всего**, включая стиль.
Укажите эмодзи, жирный заголовок и при необходимости ссылку CTA. Текст CTA задаётся на каждом языке. Общая картинка используется для всех версий; отдельный вариант может переопределить визуальное задание.
## 4. Языки и каналы
Добавьте языковые варианты, выберите стиль каждого и создайте размещения в каналах. Каждое размещение связывает сохранённый канал и конкретный вариант текста. Если каналов нет, подключите аккаунт и настройте их в [Каналах доставки](https://app.signailist.com/delivery/channels).
Язык и канал — разные настройки: два канала могут получать один язык или разные стили на одном языке. Идентичности существующих вариантов при редактировании сохраняются.
## 5. Расписание и отправка
Выберите ежедневный, недельный или месячный запуск, местное время и часовой пояс. Дни недели: понедельник — 1, воскресенье — 7. **Отправлять во все каналы во время выпуска** выравнивает размещения по общему расписанию. Снимите флажок, чтобы сохранить отдельное время и часовой пояс канала.
Явно выберите режим:
- **Проверять каждый выпуск перед отправкой:** расписание подготавливает черновики. Вы открываете выпуск, проверяете версии и отправляете готовые.
- **Отправлять автоматически:** после включения готовые версии отправляются в свои каналы без нового подтверждения.
Новая рубрика сохраняется **на паузе**. Сохранение других настроек действующей рубрики не меняет ближайший запуск. Пауза останавливает новые запуски генерации; уже запланированные отправки управляются отдельно в очереди.
## 6. Пробный выпуск и включение
Сохранение не вызывает модель. **Пробный выпуск** создаёт настоящие тексты и картинки за счёт баланса, но не публикуется и не включает расписание. Прочитайте предупреждение о стоимости и явно запустите генерацию. Заранее проверьте [баланс](https://app.signailist.com/billing).
Проверьте картинку, все языковые варианты и оформление публикации. Готовность текста ещё не означает отправку. Включайте рубрику после просмотра готового превью для сохранённых настроек. Изменённой конфигурации нужно соответствующее превью.
Можно отдельно отправить готовые версии прямо сейчас — это настоящая публикация в каналы. Для проверки превью и включения будущих запусков такая отправка не нужна.
## Что произойдёт дальше
В **Автопубликация → Обзор** видны настоящий ближайший запуск, часовой пояс и последний результат. **Очередь** разделяет подготовку, проверку, запланированные отправки и проблемы. **История** показывает результат по каждому каналу и ссылки по сохранённым квитанциям сообщений. Длинный выпуск может состоять из обложки и текста: это один редакционный выпуск с отдельными квитанциями доставки.
См. [Автоматизации из MCP](https://docs.signailist.com/ru/author-mcp) и [Восстановление после ошибок](https://docs.signailist.com/ru/author-recovery).
---
# "Как посмотреть и изменить автоматизацию, созданную через MCP"
Canonical page: https://docs.signailist.com/ru/author-mcp
Сайт, MCP и REST API используют **одни и те же сущности рабочего пространства**. Отдельной копии рубрики «только для агента» нет. Создание через MCP само по себе не включает рубрику и не публикует сообщение.
1. Выберите на сайте то же пространство, которое подключено в MCP.
2. Откройте [Автопубликацию](https://app.signailist.com/autopublish). В **Обзоре** и **Рубриках и правилах** видны авторские рубрики и новостные правила. Используйте фильтр типа или поиск по названию.
3. Проверьте действующие состояние, каналы, периодичность, часовой пояс и ближайший запуск. Для новостного правила по сигналу показано условие запуска, а не вымышленное время.
4. **Посмотреть выпуск** открывает сохранённый результат. Отдельно проверьте готовность генерации и отправку в каждый канал. Пробный выпуск обозначен как пробный, а не как состоявшаяся публикация по расписанию.
5. **Настроить** открывает пошаговый редактор той же рубрики. Фиксированные секции, роли объектов, референсы, стили вариантов, собственные картинки и часовые пояса каналов сохраняются и в свёрнутом виде.
6. Сохраните изменения. Сохранение не запускает генерацию и не публикует выпуск. Содержание и оформление применятся к следующим выпускам; старые зафиксированные выпуски и квитанции остаются историей.
## Если рубрики не видно
Проверьте выбранное пространство, фильтры типа/поиска и предупреждение о неполной загрузке. Ошибка источника данных показывается как ошибка, а не как пустое пространство. Повторите загрузку. Роль наблюдателя может смотреть настройки, но не изменять и не включать их.
## Одновременное редактирование
Редактор хранит несохранённую работу в сессии браузера, отдельно для каждого пространства и рубрики. При ошибке сохранения введённые данные остаются. Если конфигурация изменилась через MCP или в другой вкладке, устаревшее сохранение отклоняется. Откройте текущую рубрику заново: отличающийся локальный черновик предлагается восстановить явно, вместо незаметной перезаписи настроек сервера.
Старая ссылка `/author` продолжает открывать редактор. Каталоги вынесены в **Материалы**. Старые ссылки на новостных кандидатов по-прежнему открывают проверку в общем разделе автопубликации.
Создание с нуля описано в [Первой авторской рубрике](https://docs.signailist.com/ru/author-first). Если выпуск остановился, см. [Восстановление](https://docs.signailist.com/ru/author-recovery).
---
# "Почему выпуск не вышел и как продолжить"
Canonical page: https://docs.signailist.com/ru/author-recovery
Начните с [Автопубликация → Очередь](https://app.signailist.com/autopublish/queue). Проверьте пространство и фильтры. Прежде чем повторять действие, откройте выпуск. Подготовка, согласование и доставка — разные события; интерфейс сохраняет эти различия для авторских и новостных сценариев.
| Состояние | Что проверить |
| --- | --- |
| На паузе, запуска нет | Проверьте настройки и соответствующее превью, затем включите при необходимости |
| В очереди или генерируется | Дождитесь существующей задачи; новый платный пробный выпуск её не ускорит |
| Пробный выпуск готов | Он сам не отправится: проверьте его, включите будущие запуски или явно опубликуйте готовые версии |
| Авторский выпуск по расписанию готов и ждёт проверки | Рубрика работает в режиме проверки; откройте выпуск и отправьте готовые версии |
| Новостной кандидат требует проверки | Подтвердите или отклоните его на сайте либо через настроенный поток модератора |
| Частично готов | Проверьте каждый вариант; успешные тексты и общая картинка сохраняются |
| Запланировано или ожидает отправки | Проверьте время и часовой пояс каждого размещения, а не только рубрики |
| Ошибка | Проверьте баланс, каталог, обязательные картинки, язык, секции и права аккаунта |
| Результат неизвестен | Сначала проверьте канал: запрос мог выполниться до сохранения квитанции |
## Повтор доставки — не новая генерация
**Детали и повтор доставки** показывают сохранённые шаги документной отправки. Повтор использует сохранённые тексты и картинки и **не вызывает модель заново**. Расходы инфраструктуры доставки всё же возможны. Успешные части сохраняются. Если результат неизвестен, сначала проверьте канал и явно подтвердите риск дубля перед повтором.
У старой новостной отправки может быть только ID сообщения, без документной квитанции. Интерфейс не выдумывает отсутствующие квитанции и не предлагает неподдерживаемый документный повтор.
**Перегенерировать текст** — новая платная версия. **Продолжить генерацию** может использовать сохранённые исходники, готовые варианты и известный результат картинки, но недостающие шаги могут снова расходовать баланс. Это не бесплатная замена повтору доставки. Уже опубликованные варианты нельзя перегенерировать этим действием авторского выпуска.
После обрыва запроса пробного выпуска сначала проверьте очередь. До подтверждённого ответа редактор сохраняет логический идентификатор попытки: повторный запрос может найти тот же выпуск вместо создания нового платного.
## Частые причины
- **Баланс или дневной лимит:** откройте [Биллинг](https://app.signailist.com/billing). Пополнение и изменение лимита — отдельное ручное решение. Повтор не обходит бюджет.
- **Каталог или изображение недоступны:** откройте **Материалы**, синхронизируйте API либо исправьте исходную систему или ручной объект. Токен не передаётся моделям. Генерация требует настоящих обязательных референсов.
- **Нет секции или неверный язык:** проверьте проблемную версию. Каждая обязательная секция должна встретиться ровно один раз. Правильный фиксированный заголовок ещё не доказывает язык сгенерированного текста. Исправление инструкции повлияет на будущие выпуски, а не перепишет старый снимок автоматически.
- **Telegram-сессия или права:** переподключите аккаунт и проверьте права в **Каналах доставки**. Включение расписания не исправляет отозванную сессию.
- **Один канал отправился, другой нет:** смотрите квитанции отдельно. Не генерируйте все языки и не переотправляйте успешный канал только из-за ошибки другого.
Обзор показывает недавние авторские выпуски и новостную очередь. Более ранние результаты ищите в списке выпусков нужной рубрики. Ограниченная история не означает, что более ранних выпусков не существует.
---
# "Пример: дайджест RSS в Discord"
Canonical page: https://docs.signailist.com/ru/rss-discord
В этом примере RSS/Atom используется как источник, а Discord — как канал доставки. Сбор, AI-анализ, редактирование дайджеста и публикация работают по общему сценарию. Результат можно также отправить в Telegram или в оба сервиса.
## Перед началом
Подготовьте публичный HTTPS URL ленты RSS/Atom и URL вебхука канала Discord. Понадобятся роль владельца или редактора и достаточный баланс выбранного пространства для сбора, AI-анализа, генерации и доставки. Telegram-аккаунт для этого примера не нужен.
## Первый выпуск
1. В **Источниках** добавьте ленту, выбрав RSS. Включите сбор, нажмите **Собрать сейчас** и дождитесь сохранённых записей. Подробнее — [Источники](https://docs.signailist.com/ru/sources#rss-%D0%B8-atom).
2. Свяжите активную тему и нажмите **Подготовить сохранённые записи для AI** для первых записей. Проверьте оценки перед выбором кандидатов в дайджест.
3. В **Каналы доставки → Discord** сохраните назначение с названием и URL вебхука. Отправьте помеченное тестовое сообщение для проверки подключения. Подробнее — [Каналы доставки](https://docs.signailist.com/ru/delivery#discord).
4. [Создайте дайджест](https://docs.signailist.com/ru/digests): выберите период, материалы и шаблон, затем сгенерируйте текст. Проверьте его во вкладках **Текст**, **Изображение** и **Источники**.
5. В **Публикации** подготовьте и подтвердите версию, отметьте назначение Discord и отправьте. В том же действии можно выбрать настроенное назначение Telegram.
6. Проверьте статус доставки каждого канала, затем откройте Discord и посмотрите выпуск.
Для пошаговой настройки откройте **Сценарии → Дайджест RSS → Discord**. Сценарий помогает сохранить источник, тему, стиль и назначение для этого примера.
## Регулярные выпуски
Сохраните [правило еженедельного дайджеста](https://docs.signailist.com/ru/signals-and-autopublish#weekly-digest) на паузе. Проверьте назначение, ближайшее время запуска и часовой пояс, затем включите правило. Каждый созданный выпуск ожидает подтверждения на сайте.
Пауза правила прекращает создание новых выпусков. Чтобы также остановить сбор новостей, отдельно приостановите источник.
---
# API, MCP и вебхуки
Canonical page: https://docs.signailist.com/ru/developers
Подключите агента или собственную систему к workspace. После однократного входа и выдачи разрешений сбор, обработка и публикации выполняются через общие очереди и баланс Signailist.
Подключение Telegram и восстановление разрешений внешнего провайдера могут требовать браузера.
## Руководства для разработчиков
- [Все REST-запросы и MCP-инструменты](https://docs.signailist.com/ru/developers-api): полный каталог, права, параметры, схемы и curl.
- [Подключение MCP](https://docs.signailist.com/ru/developers-mcp): Codex, Claude, Cursor и VS Code/Copilot, разрешения и готовые промпты подключения.
- [Готовые промпты сценариев](https://docs.signailist.com/ru/developers-recipes): еженедельный дайджест, внешняя система и публикация.
- [Приём данных и вебхуки](https://docs.signailist.com/ru/developers-webhooks): квитанции, события, проверка подписи, повторы и ротация.
- Для агентов: [индекс](https://docs.signailist.com/llms.txt), [вся документация RU](https://docs.signailist.com/llms-full-ru.txt), [OpenAPI](https://docs.signailist.com/openapi.json).
## Подключение MCP
Адрес удалённого сервера: `https://api.signailist.com/mcp`. Транспорт — Streamable HTTP, авторизация — OAuth. Клиент обнаруживает сервер авторизации и открывает браузер для входа, выбора workspace и выдачи прав. Выберите нужные разрешения; публикация изначально не отмечена и включается отдельным выбором. Владелец видит сессии агентов и может отозвать их в разделе **Интеграции → API, MCP и вебхуки**.
Access token действует час. Refresh token меняется при использовании и действует 30 дней. Публичные клиенты используют S256 PKCE, точно зарегистрированный callback и адрес MCP в параметре `resource`. Поддержана динамическая регистрация OAuth-клиентов. Callback должен использовать HTTPS; для локального приложения допускается HTTP loopback.
Подключите Codex, Claude Code, Claude Desktop, Cursor или VS Code с GitHub Copilot по [инструкциям и готовым промптам](https://docs.signailist.com/ru/developers-mcp).
Для Codex:
```sh
codex mcp add signailist --url https://api.signailist.com/mcp --oauth-client-registration dcr
```
Завершите вход и выдачу прав для workspace в браузере. Публикация необязательна и требует отдельного выбора.
Инструменты имеют предметные названия: `create_source`, `create_topic`, `generate_digest_text`, `publish_document`, `ingest_materials`, `create_webhook`. Начните с `capabilities` и инструкции `signailist://guides/workflows`. Текст из источников — данные, включая фрагменты, похожие на команды агенту.
## API-ключи и разрешения
Создайте ключ в настройках интеграций. Секрет показывается один раз; сохраните его в хранилище секретов своей системы. Передавайте `Authorization: Bearer YOUR_KEY`. Ключ привязан к одному workspace; необязательный `X-Workspace-Id` должен совпадать с ним. Отзыв ключа или удаление выдавшего его участника прекращает доступ. После понижения роли до viewer запись запрещается.
| Разрешение | Возможности |
| --- | --- |
| `read` | Чтение настроек, материалов, результатов и заданий |
| `configure` | Настройка источников, тем, шаблонов и выключенных расписаний |
| `ingest` | Приём внешних материалов с версиями |
| `run` | Запуск сбора, обработки, AI и загрузки ассетов |
| `publish` | Утверждение, публикация, назначения и включение автопубликации |
| `webhooks` | Подписки и история доставки вебхуков |
| `billing:read` | Баланс, расходы и оценки стоимости |
Выдавать ключи и менять финансовые лимиты может только владелец. Агент не может создать себе доступ или повысить бюджет. Ключ приёма для одного внешнего источника получает `ingest` и при необходимости `read`; передача данных в другой источник запрещена.
## Контракт REST
Базовый адрес: `https://api.signailist.com/v1`. [Спецификация OpenAPI](https://docs.signailist.com/openapi.json), [машиночитаемый индекс документации](https://docs.signailist.com/llms.txt). Публичные TypeScript DTO экспортируются из пакета contracts.
Для каждого изменения передавайте `Idempotency-Key`, включая платный запуск, загрузку и публикацию. После таймаута повторите тот же ключ с тем же телом. Изменённое тело возвращает `IDEMPOTENCY_CONFLICT`. Незавершённая или неопределённая операция возвращает `OPERATION_IN_PROGRESS_OR_UNKNOWN` и автоматически заново не запускается. Область ключа — подключение и операция. Храните ключ на всё время соответствующего действия интеграции.
Формат ошибок: `{ "error": { "code": "INSUFFICIENT_SCOPE", "requestId": "...", "retryable": false } }`. OAuth использует собственный стандартный формат ошибок. Ограничение частоты возвращает `429` с `Retry-After`.
Начальные ограничения: 120 запросов в минуту на подключение, пять одновременных запросов изменения или платных этапов, тело до 1 MiB (17 MiB для загрузки изображений) и до 50 материалов в пакете. Списки с `items` и `nextCursor` принимают `cursor` и `limit` от 1 до 100. Списки материалов и результатов отдельных провайдеров сохраняют параметры отбора, указанные в OpenAPI; не переносите формат одного списка на все остальные.
Постановка в очередь означает принятие работы. Проверяйте `/v1/jobs`, состояние анализа источника, дайджест или `/v1/deliveries/{id}`, чтобы получить фактический результат. Источники и расписания создаются выключенными; включайте их отдельно после настройки. Создание дайджеста сохраняет черновик, генерация текста и изображения запускаются отдельными действиями.
## Собственные материалы
1. Создайте приватный источник: `POST /v1/external-sources`, тело `{ "title": "Наша система" }`.
2. Отправьте `POST /v1/external-sources/{id}/items` с массивом `items` и стабильным ключом запроса.
3. Сохраните результат для каждого элемента: `accepted`, `duplicate` или `rejected`. Принятый элемент содержит `id` и `jobId`, обработка выполняется асинхронно.
```json
{"items":[{"externalId":"article-42","version":"1","title":"Release notes","text":"The release is available.","publishedAt":"2026-10-20T12:00:00Z","url":"https://example.com/releases/42","metadata":{"category":"release"}}]}
```
Обязательны `externalId`, `version`, `title`, `text` и `publishedAt` с часовым поясом. URL и JSON-метаданные необязательны. Текст — до 65 536 символов, метаданные — до 16 KiB. Изменение содержимого требует новой версии. Повтор неизменённой версии не создаёт обработку и списание повторно; изменение старой возвращает `ITEM_VERSION_CONFLICT`.
Материалы изолированы workspace. Источник получает push и не опрашивает вашу систему. Изображения загружайте отдельно через `/v1/assets`: `fileBase64` содержит image data URL, размер файла после декодирования — до 12 MiB. Публичные интеграции не загружают ассеты по произвольным внешним URL.
Примеры: [curl](https://docs.signailist.com/examples/integrations/intake.sh), [TypeScript](https://docs.signailist.com/examples/integrations/client.ts), [Python](https://docs.signailist.com/examples/integrations/client.py).
## Исходящие вебхуки
`POST /v1/webhooks` принимает `name`, публичный HTTPS `url`, массив `events` и необязательный `includeResult`. Скопируйте возвращённый секрет. Повтор идемпотентного запроса вернёт ID подписки без секрета; если исходный ответ потерян, смените секрет. По умолчанию событие содержит ссылку на объект и состояние; `includeResult: true` добавляет данные результата на момент перехода состояния.
События: `processing.completed`, `processing.failed`, `digest.ready`, `approval.required`, `publication.sent`, `publication.failed`, `publication.unknown`, `source.failed`, `balance.low`, `balance.depleted`, `limit.reached`. Завершение preprocessing не означает завершение AI-анализа: проверяйте состояние источника и задания. Низкий баланс — пересечение USD 1 вниз, исчерпание — пересечение нуля.
Конверт: `schemaVersion`, `id`, `type`, `createdAt`, `workspaceId`, `objectId`, `data`. Дубликаты и изменение порядка возможны; дедуплицируйте по `id`. Получатель быстро возвращает любой `2xx` после проверки и сохранения события; свою долгую обработку ставит в очередь.
Заголовки: `Signailist-Event-Id`, `Signailist-Timestamp` в Unix seconds, `Signailist-Signature` вида `v1=HEX_HMAC`. Рассчитайте HMAC-SHA256 от `timestamp + "." + raw_body`, сравните в постоянное время и отклоняйте время старше пяти минут. Проверяйте исходные байты до разбора JSON. [Пример проверки на Python](https://docs.signailist.com/examples/integrations/verify.py).
Секреты шифруются в хранилище. При смене старый действует ещё 24 часа; в это время заголовок содержит обе подписи. Адрес не может содержать учётные данные или fragment, вести на приватный/зарезервированный IP или перенаправлять доставку. DNS проверяется перед каждой попыткой.
Доставка использует durable outbox и очередь: до восьми физических попыток за сутки с увеличением задержки. Идентификатор события сохраняется. История хранится 30 дней. Смотрите `/v1/webhooks/deliveries`; повтор неудачной платной доставки — `/v1/webhooks/deliveries/{id}/retry`. События исчерпания баланса и лимита получают до трёх бесплатных попыток и не перезапускаются этим endpoint.
При неопределённом исходе публикации сначала проверьте назначение. Повтор доставки публикации требует явного `acknowledgeDuplicateRisk: true`.
## Расходы и лимиты
Для планирования без авторизации передайте агенту [публичный калькулятор](https://signailist.com/ru/pricing). По ссылкам Markdown/JSON он получит текущие клиентские цены, формулы и готовый пример расчёта. Это не заменяет оценку конкретной операции с авторизацией и резервирование бюджета. Подробнее — [Баланс и расходы](https://docs.signailist.com/ru/billing#%D0%BE%D1%86%D0%B5%D0%BD%D0%B8%D1%82%D0%B5-%D1%80%D0%B0%D1%81%D1%85%D0%BE%D0%B4%D1%8B-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%BE%D0%BC).
Подписки за доступ к API/MCP нет. Чтение и настройка бесплатны в пределах лимитов. Приём и сохранение материалов, сбор, AI, ассеты, публикации и физические попытки доставки списываются с общего баланса. Определение названия источника также может расходовать ресурсы. Неудавшийся внешний запрос может быть платным. За MCP дополнительной комиссии нет.
До платного этапа резервируется консервативная оценка ресурсов. Фактическое списание сохраняется в общем ledger, остаток резерва освобождается. `/v1/budget` разделяет баланс, резерв и доступную сумму; `/v1/estimates` выдаёт оценку по центральному реестру цен. Оценка инфраструктуры не является счётом внешнего провайдера.
Суточные лимиты владельца рассчитываются по календарному дню UTC запуска каждого этапа, включая ожидающие резервы. Происхождение сохраняется у фоновых заданий и расписаний. Автоматического пополнения нет — обратитесь к администратору. При нулевом доступном балансе остаются чтение, биллинг, отзыв, пауза и отмена ожидающих работ.
Прерванная операция может оставить резерв, требующий сверки. Сам по себе таймаут не означает, что средства можно освободить: внешняя работа ещё может выполняться.
## Рецепты
**Еженедельный дайджест через агента:** `capabilities` и баланс → выключенные источники → темы и привязка тем к источникам → шаблон → включение источников через `update_source` → сбор и проверка готовности → черновик по обработанным ID → отдельная генерация → предпросмотр документа → утверждение точной версии → публикация со стабильным `logicalPublicationId`. Для повторения создайте расписание с часовым поясом, назначением и шаблоном, затем включите `enable_schedule` с правом `publish`.
**Своя система получает результат:** внешний источник → вебхук `processing.completed` с `includeResult` → передача версий материалов → сохранение квитанций → проверка и дедупликация событий → контроль состояния источника для последующего AI-анализа.
**Публикация с ограниченным бюджетом:** владелец задаёт лимиты workspace и подключения → выдаёт `publish` нужному подключению → агент готовит и проверяет черновик → утверждает версию → публикует → проверяет квитанции и `/v1/billing/usage`. При достижении лимита приостанавливает расписание. Переподключение агента не пополняет баланс.
---
# Подключение MCP и готовый промпт
Canonical page: https://docs.signailist.com/ru/developers-mcp
Один раз подключите совместимого агента, затем управляйте Signailist из чата. Адрес MCP: **`https://api.signailist.com/mcp`**, транспорт **Streamable HTTP**, авторизация **OAuth**. API-ключ предназначен для REST и не заменяет OAuth-токен MCP.
## Выберите клиент
[Codex](#подключить-codex) · [Claude Code](#claude-code) · [Claude Desktop / браузер](#claude-desktop-и-claude-в-браузере) · [Cursor](#cursor) · [VS Code / Copilot](#vs-code-с-github-copilot)
## Подключить Codex
Команда добавляет постоянную запись `signailist` в общий пользовательский конфиг Codex и запускает авторизацию:
```sh
codex mcp add signailist --url https://api.signailist.com/mcp --oauth-client-registration dcr
```
Если запись уже существует, сначала проверьте её через `codex mcp get signailist`, а не создавайте дубль. Чтобы завершить незаконченный вход или авторизоваться заново:
```sh
codex mcp login signailist --oauth-client-registration dcr
```
Войдите как владелец workspace. **Выберите нужное пространство** перед выдачей доступа: открытый ранее тестовый workspace может не подходить для вашей задачи. Выберите разрешения и самостоятельно нажмите **«Разрешить доступ»**. Аргументы инструмента не позволяют переключить workspace после подключения. Для другого пространства нужно отдельное подключение/согласие.
Поддерживаемые клиенты Codex на одном хосте используют общий конфиг MCP. Если текущий чат не обновил каталог инструментов, начните новый. Попросите агента вызвать `capabilities`, `get_integration` и `budget` через настоящее MCP-подключение: запись в конфиге сама по себе не подтверждает авторизацию. [Официальная документация Codex](https://developers.openai.com/codex/mcp).
## Какие права выбрать
| Задача | Разрешения |
| --- | --- |
| Читать результаты и расходы | `read`, `billing:read` |
| Настроить источники, темы, шаблоны и выключенное расписание | Дополнительно `configure` |
| Собирать источники, запускать AI, загружать ассеты | Дополнительно `run` |
| Передавать собственные материалы | Дополнительно `ingest` |
| Утверждать, отправлять и **включать расписание публикаций** | Дополнительно `publish` |
| Управлять подписками и историей вебхуков | Дополнительно `webhooks` |
Публикация изначально не отмечена. Одного `run` недостаточно для включения расписания: нужен `publish`, даже если расписание сначала готовит кандидата на утверждение. При создании расписание выключено. Пауза источника и пауза расписания независимы.
Суточные лимиты меняет владелец в **«Интеграции → API, MCP и вебхуки»**. Агент видит бюджет, но не может его повысить. Пополнение выполняется вручную через администратора. Вход в провайдера, подключение Telegram и выдача OAuth-разрешений могут требовать действий владельца в браузере.
## Скопировать промпт подключения
Скопируйте блок целиком в своего агента. В нём есть ссылки на всю документацию и проверка фактического подключения после входа.
```text
Подключи MCP Signailist к моему Codex.
Сначала прочитай https://docs.signailist.com/llms.txt и
https://docs.signailist.com/ru/developers-mcp.
Полная документация продукта и API: https://docs.signailist.com/llms-full-ru.txt.
Машиночитаемый контракт API: https://docs.signailist.com/openapi.json.
Проверь существующие настройки MCP. Если запись signailist уже указывает на
https://api.signailist.com/mcp, используй её. Не перезаписывай другое подключение
и не показывай токены. Для установленного Codex CLI используй:
codex mcp add signailist --url https://api.signailist.com/mcp --oauth-client-registration dcr
Если запись уже есть: codex mcp login signailist --oauth-client-registration dcr.
Дай мне выбрать workspace и подтвердить OAuth-доступ в браузере.
Для первой настройки предложи read, configure и billing:read. Объясни, что run
нужен для платной работы, а publish — для включения расписания публикаций.
Не выдавай себе дополнительные права и не увеличивай финансовые лимиты.
После входа вызови capabilities, get_integration и budget через реальное MCP.
Покажи выбранный workspace, выданные права и доступный баланс.
Не запускай сбор, генерацию, публикацию и расписания при проверке подключения.
Если инструменты ещё не появились в чате, объясни обновление клиента или новый
чат; не выдавай сохранённый конфиг за проверенное подключение.
```
## Claude Code
Добавьте Signailist для своего пользователя, во всех проектах:
```sh
claude mcp add --transport http --scope user signailist https://api.signailist.com/mcp
```
Если запись есть, проверьте её через `claude mcp get signailist`. Запустите Claude Code, откройте `/mcp`, выберите Signailist и авторизуйтесь. Укажите workspace и права в браузере. Затем используйте промпт ниже. [Документация Claude Code](https://code.claude.com/docs/en/mcp).
## Claude Desktop и Claude в браузере
Откройте **Customize → Connectors → Add → Custom → Web**. Укажите имя **Signailist** и URL `https://api.signailist.com/mcp`. Выберите OAuth-вход; если предлагается выбор OAuth-клиента, используйте **Register automatically** — динамическую регистрацию Signailist. Подтвердите доступ в браузере, затем включите коннектор в чате. Добавление коннекторов может ограничиваться политикой организации. Используйте удалённый коннектор, а не локальную stdio-конфигурацию с URL. [Документация коннекторов Claude](https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities).
## Cursor
Добавьте запись в `~/.cursor/mcp.json` для личного подключения или `.cursor/mcp.json` для проекта, сохранив другие серверы:
```json
{
"mcpServers": {
"signailist": {
"url": "https://api.signailist.com/mcp"
}
}
}
```
Откройте настройки MCP в **Customize**, подключите Signailist и завершите OAuth. Включите инструменты в Agent-чате. Статический Authorization-заголовок не нужен. [Документация Cursor](https://cursor.com/docs/mcp).
## VS Code с GitHub Copilot
В палитре команд выполните **MCP: Add Server**. Выберите **HTTP**, введите `https://api.signailist.com/mcp` и имя `signailist`. Выберите место конфигурации для используемого агентного движка чата; для личной конфигурации Copilot — **Copilot Global**, если предлагается. Завершите вход и включите инструменты в чате.
Для формата конфигурации VS Code добавьте в `.vscode/mcp.json`:
```json
{
"servers": {
"signailist": {
"type": "http",
"url": "https://api.signailist.com/mcp"
}
}
}
```
Формат `servers` отличается от `mcpServers` в Cursor. У агентных движков Copilot конфигурация тоже может отличаться; используйте мастер подключения для выбранного движка. [Справочник VS Code MCP](https://code.visualstudio.com/docs/agents/reference/mcp-configuration).
## Скопировать промпт для любого клиента
Подходит для Claude Code, Claude Desktop, Cursor и Copilot. Если агент не может менять настройки, он объяснит шаги выше. После подключения [промпты еженедельного дайджеста и других сценариев](https://docs.signailist.com/ru/developers-recipes) используют одни и те же инструменты Signailist в каждом клиенте.
```text
Помоги подключить MCP Signailist в [Claude Code / Claude Desktop / Cursor / VS Code Copilot].
Прочитай https://docs.signailist.com/llms.txt и
https://docs.signailist.com/ru/developers-mcp.
Вся документация: https://docs.signailist.com/llms-full-ru.txt.
Контракт API: https://docs.signailist.com/openapi.json.
Используй https://api.signailist.com/mcp, Streamable HTTP и OAuth.
Следуй инструкции моего клиента, не копируй конфигурацию другого приложения.
Проверь настройки, сохрани другие серверы и используй существующее подключение
Signailist, если оно есть. Если настройки тебе недоступны, объясни точные ручные шаги.
Не запрашивай API-ключи, токены и пароли в чате.
Дай мне выбрать workspace и права в браузере. Для настройки предложи read,
configure и billing:read; отдельно объясни run и publish.
После подключения вызови capabilities, get_integration и budget через MCP Signailist.
Покажи workspace, права и доступный баланс. При проверке подключения не запускай
сбор, генерацию, публикацию, расписания и не увеличивай лимиты.
Если инструменты не появились, помоги включить коннектор или обновить список в чате.
```
## Отключение и диагностика
- Нет инструментов: проверьте адрес, завершите OAuth и обновите каталог клиента. Конфиг и SDK-тест не заменяют реальный вызов инструмента.
- Не тот workspace: подключитесь заново и выберите нужный. Подмена `workspaceId` в теле инструмента запрещена.
- `403`: проверьте `get_integration` и `capabilities`; недостающие права выдаёт владелец новым согласием. Понижение роли и отзыв доступа действуют и на задания очереди.
- `402`: проверьте `budget`, резервы и суточные лимиты. После устранения причины используйте исходный ключ идемпотентности, если это повтор прежнего намерения.
- Провайдер отключён: пройдите соответствующий шаг в [Telegram](https://docs.signailist.com/ru/telegram) или [доставке](https://docs.signailist.com/ru/delivery), затем снова проверьте готовность.
- Отзовите доступ в настройках Signailist. `codex mcp logout signailist` удаляет локальное согласие; `codex mcp remove signailist` удаляет запись конфигурации. Для прекращения доступа используйте отзыв на сервере, а не только локальное удаление записи.
Дальше: [готовые промпты сценариев](https://docs.signailist.com/ru/developers-recipes) и [все REST-запросы и MCP-инструменты](https://docs.signailist.com/ru/developers-api).
---
# Все REST-запросы и MCP-инструменты
Canonical page: https://docs.signailist.com/ru/developers-api
Здесь перечислены все **103** публичных операций реестра. Сайт использует и внутренние маршруты; они не являются публичным API для клиентов. REST: **https://api.signailist.com/v1**. MCP: **https://api.signailist.com/mcp**.
[OpenAPI](https://docs.signailist.com/openapi.json) · [Подключение MCP](https://docs.signailist.com/ru/developers-mcp) · [Промпты и сценарии](https://docs.signailist.com/ru/developers-recipes) · [Приём и вебхуки](https://docs.signailist.com/ru/developers-webhooks)
## Как читать справочник
REST использует API-ключ одного workspace; MCP — OAuth-согласие. Все примеры требуют замены ID и заполнителей своими значениями. Секрет в SIGNAILIST_API_KEY должен поступать из вашего хранилища секретов. Для изменяющих запросов обязателен постоянный Idempotency-Key: повтор прежнего намерения использует прежний ключ и тело. GET не требует этого заголовка. Примеры — формы запросов, они не выполняются документацией.
Метка платного запуска отражает реестр, а не гарантирует бесплатное выполнение всей последующей цепочки. Включение расписания может запустить будущие платные этапы. Создание источника с автоматическим получением названия может потребовать run и платный запрос метаданных. Сначала проверяйте возможности, готовность и бюджет.
Таблица полей и сворачиваемая JSON Schema показывают фактическую схему публичной проверки. У операций с общей object-схемой дополнительные ограничения применяет общий обработчик: это не разрешение передавать произвольные поля. Для таких операций используйте описанные примеры сценариев; request.json нужно заполнить телом своей операции. Существующие write-поля не обязаны совпадать с полями строки в ответе списка. Не передавайте пользовательский workspaceId: пространство закреплено ключом. Исключение — проверяемое совпадение workspaceId внутри сохраняемого документа.
Курсоры возвращаются только указанными ниже постраничными операциями: items и nextCursor. billing_usage использует page/pageSize. list_webhooks возвращает до 100 подписок без курсора. Остальные ответы могут быть объектами, массивами или вложенными структурами; не считайте их универсальным списком.
## Общие результаты и ошибки
200/201 означают ответ/создание, 202 — приём работы, 204 — успех без тела. Конкретный обработчик может вернуть 200 или 201 вместе с идентификатором очереди: это не доказательство готового результата. Сохраняйте ID и проверяйте задание, источник, дайджест или квитанцию доставки. Нет единого поля jobId для всех запусков.
```json
{
"error": {
"code": "INSUFFICIENT_SCOPE",
"requestId": "REQUEST_ID",
"retryable": false
}
}
```
400 — неверный ввод; 401 — ключ/токен отсутствует, истёк или отозван; 402 — баланс/суточный лимит; 403 — права/workspace; 404 — объект/маршрут; 409 — конфликт версии/идемпотентности или неопределённый результат; 413 — размер; 429 — частота/параллельность, учитывайте Retry-After. Максимум 120 запросов в минуту на подключение, пять параллельных мутаций или платных этапов. OAuth использует собственные стандартные ошибки.
## Каталог
| MCP | REST | Право | Платный запуск |
| --- | --- | --- | --- |
| [author_overview](#author_overview) | `GET /v1/author/overview` | `read` | Нет¹ |
| [edit_telegram_publication](#edit_telegram_publication) | `POST /v1/accounts/telegram/{id}/messages/edit` | `publish` | Нет¹ |
| [verify_telegram_publications](#verify_telegram_publications) | `POST /v1/accounts/telegram/{id}/messages/check` | `read` | Нет¹ |
| [regenerate_author_version](#regenerate_author_version) | `POST /v1/author/editions/{id}/regenerate-version` | `run` | Да |
| [resume_author_edition](#resume_author_edition) | `POST /v1/author/editions/{id}/resume` | `run` | Да |
| [check_telegram_channels](#check_telegram_channels) | `POST /v1/accounts/telegram/{id}/channels/check` | `configure` | Нет¹ |
| [sync_telegram_channels](#sync_telegram_channels) | `POST /v1/accounts/telegram/{id}/channels/sync` | `configure` | Нет¹ |
| [list_content_catalogs](#list_content_catalogs) | `GET /v1/author/catalogs` | `read` | Нет¹ |
| [create_content_catalog](#create_content_catalog) | `POST /v1/author/catalogs` | `configure` | Нет¹ |
| [get_content_catalog](#get_content_catalog) | `GET /v1/author/catalogs/{id}` | `read` | Нет¹ |
| [sync_content_catalog](#sync_content_catalog) | `POST /v1/author/catalogs/{id}/sync` | `configure` | Нет¹ |
| [list_catalog_items](#list_catalog_items) | `GET /v1/author/catalogs/{id}/items` | `read` | Нет¹ |
| [put_catalog_item](#put_catalog_item) | `PUT /v1/author/catalogs/{id}/items` | `configure` | Нет¹ |
| [list_author_series](#list_author_series) | `GET /v1/author/series` | `read` | Нет¹ |
| [create_author_series](#create_author_series) | `POST /v1/author/series` | `configure` | Нет¹ |
| [get_author_series](#get_author_series) | `GET /v1/author/series/{id}` | `read` | Нет¹ |
| [update_author_series](#update_author_series) | `PUT /v1/author/series/{id}` | `configure` | Нет¹ |
| [set_author_automation](#set_author_automation) | `POST /v1/author/series/{id}/automation` | `configure` | Нет¹ |
| [trial_author_series](#trial_author_series) | `POST /v1/author/series/{id}/trial` | `run` | Да |
| [list_author_editions](#list_author_editions) | `GET /v1/author/series/{id}/editions` | `read` | Нет¹ |
| [get_author_edition](#get_author_edition) | `GET /v1/author/editions/{id}` | `read` | Нет¹ |
| [publish_author_edition](#publish_author_edition) | `POST /v1/author/editions/{id}/publish` | `publish` | Да |
| [delete_source](#delete_source) | `DELETE /v1/sources/{id}` | `configure` | Нет¹ |
| [delete_template](#delete_template) | `DELETE /v1/templates/{id}` | `configure` | Нет¹ |
| [delete_schedule](#delete_schedule) | `DELETE /v1/schedules/{id}` | `configure` | Нет¹ |
| [list_publications](#list_publications) | `GET /v1/publications` | `read` | Нет¹ |
| [list_telegram_accounts](#list_telegram_accounts) | `GET /v1/accounts/telegram` | `read` | Нет¹ |
| [get_source_topic_tracking](#get_source_topic_tracking) | `GET /v1/source-topic-tracking` | `read` | Нет¹ |
| [list_sources](#list_sources) | `GET /v1/sources` | `read` | Нет¹ |
| [create_source](#create_source) | `POST /v1/sources` | `configure` | Нет¹ |
| [update_source](#update_source) | `PATCH /v1/sources/{id}` | `configure` | Нет¹ |
| [collect_source](#collect_source) | `POST /v1/sources/{id}/collect` | `run` | Да |
| [prepare_source](#prepare_source) | `POST /v1/sources/{id}/prepare` | `run` | Да |
| [track_source_topics](#track_source_topics) | `POST /v1/source-topic-tracking` | `configure` | Нет¹ |
| [source_status](#source_status) | `GET /v1/sources/{id}/analysis-status` | `read` | Нет¹ |
| [source_materials](#source_materials) | `GET /v1/sources/{id}/materials` | `read` | Нет¹ |
| [source_results](#source_results) | `GET /v1/sources/{id}/results` | `read` | Нет¹ |
| [list_topics](#list_topics) | `GET /v1/topics` | `read` | Нет¹ |
| [create_topic](#create_topic) | `POST /v1/topics` | `configure` | Нет¹ |
| [update_topic](#update_topic) | `PATCH /v1/topics/{id}` | `configure` | Нет¹ |
| [delete_topic](#delete_topic) | `DELETE /v1/topics/{id}` | `configure` | Нет¹ |
| [list_templates](#list_templates) | `GET /v1/templates` | `read` | Нет¹ |
| [create_template](#create_template) | `POST /v1/templates` | `configure` | Нет¹ |
| [update_template](#update_template) | `PATCH /v1/templates/{id}` | `configure` | Нет¹ |
| [generate_template](#generate_template) | `POST /v1/templates/generate` | `run` | Да |
| [list_digests](#list_digests) | `GET /v1/digests` | `read` | Нет¹ |
| [digest_candidates](#digest_candidates) | `GET /v1/digest-candidates` | `read` | Нет¹ |
| [create_digest](#create_digest) | `POST /v1/digests` | `configure` | Нет¹ |
| [get_digest](#get_digest) | `GET /v1/digests/{id}` | `read` | Нет¹ |
| [update_digest](#update_digest) | `PATCH /v1/digests/{id}` | `configure` | Нет¹ |
| [generate_digest_text](#generate_digest_text) | `POST /v1/digests/{id}/generate-text` | `run` | Да |
| [generate_digest_image](#generate_digest_image) | `POST /v1/digests/{id}/generate-image` | `run` | Да |
| [score_material](#score_material) | `POST /v1/materials/{id}/score` | `run` | Да |
| [get_document](#get_document) | `GET /v1/digests/{id}/document` | `read` | Нет¹ |
| [save_document](#save_document) | `PUT /v1/digests/{id}/document` | `configure` | Нет¹ |
| [approve_document](#approve_document) | `POST /v1/digests/{id}/approve` | `publish` | Нет¹ |
| [publish_document](#publish_document) | `POST /v1/digests/{id}/publish` | `publish` | Да |
| [list_connections](#list_connections) | `GET /v1/connections` | `read` | Нет¹ |
| [create_discord_connection](#create_discord_connection) | `POST /v1/connections` | `publish` | Нет¹ |
| [revoke_connection](#revoke_connection) | `POST /v1/connections/{id}/revoke` | `publish` | Нет¹ |
| [list_targets](#list_targets) | `GET /v1/targets` | `read` | Нет¹ |
| [create_target](#create_target) | `POST /v1/targets` | `publish` | Нет¹ |
| [update_target](#update_target) | `PATCH /v1/targets/{id}` | `publish` | Нет¹ |
| [list_schedules](#list_schedules) | `GET /v1/schedules` | `read` | Нет¹ |
| [create_schedule](#create_schedule) | `POST /v1/schedules` | `configure` | Нет¹ |
| [update_schedule](#update_schedule) | `PATCH /v1/schedules/{id}` | `publish` | Нет¹ |
| [enable_schedule](#enable_schedule) | `POST /v1/schedules/{id}/enable` | `publish` | Нет¹ |
| [pause_schedule](#pause_schedule) | `POST /v1/schedules/{id}/pause` | `configure` | Нет¹ |
| [trigger_schedule](#trigger_schedule) | `POST /v1/schedules/{id}/trigger` | `publish` | Да |
| [list_candidates](#list_candidates) | `GET /v1/publication-candidates` | `read` | Нет¹ |
| [approve_candidate](#approve_candidate) | `POST /v1/publication-candidates/{id}/approve` | `publish` | Да |
| [reject_candidate](#reject_candidate) | `POST /v1/publication-candidates/{id}/reject` | `publish` | Нет¹ |
| [get_delivery](#get_delivery) | `GET /v1/deliveries/{id}` | `read` | Нет¹ |
| [retry_delivery](#retry_delivery) | `POST /v1/deliveries/{id}/retry` | `publish` | Да |
| [cancel_publication](#cancel_publication) | `POST /v1/publications/{id}/cancel` | `configure` | Нет¹ |
| [list_jobs](#list_jobs) | `GET /v1/jobs` | `read` | Нет¹ |
| [cancel_job](#cancel_job) | `POST /v1/jobs/{id}/cancel` | `configure` | Нет¹ |
| [list_assets](#list_assets) | `GET /v1/assets` | `read` | Нет¹ |
| [upload_asset](#upload_asset) | `POST /v1/assets` | `run` | Да |
| [list_signals](#list_signals) | `GET /v1/signals` | `read` | Нет¹ |
| [create_signal](#create_signal) | `POST /v1/signals` | `configure` | Нет¹ |
| [update_signal](#update_signal) | `PATCH /v1/signals/{id}` | `configure` | Нет¹ |
| [enable_signal](#enable_signal) | `POST /v1/signals/{id}/enable` | `run` | Нет¹ |
| [pause_signal](#pause_signal) | `POST /v1/signals/{id}/pause` | `configure` | Нет¹ |
| [billing_summary](#billing_summary) | `GET /v1/billing/summary` | `billing:read` | Нет¹ |
| [billing_usage](#billing_usage) | `GET /v1/billing/usage` | `billing:read` | Нет¹ |
| [get_job](#get_job) | `GET /v1/jobs/{id}` | `read` | Нет¹ |
| [list_models](#list_models) | `GET /v1/models` | `read` | Нет¹ |
| [list_reservations](#list_reservations) | `GET /v1/reservations` | `billing:read` | Нет¹ |
| [capabilities](#capabilities) | `GET /v1/capabilities` | `read` | Нет¹ |
| [create_external_source](#create_external_source) | `POST /v1/external-sources` | `configure` | Нет¹ |
| [ingest_materials](#ingest_materials) | `POST /v1/external-sources/{id}/items` | `ingest` | Нет¹ |
| [budget](#budget) | `GET /v1/budget` | `billing:read` | Нет¹ |
| [estimate](#estimate) | `POST /v1/estimates` | `billing:read` | Нет¹ |
| [get_integration](#get_integration) | `GET /v1/integration` | `read` | Нет¹ |
| [revoke_integration](#revoke_integration) | `POST /v1/integration/revoke` | `read` | Нет¹ |
| [create_webhook](#create_webhook) | `POST /v1/webhooks` | `webhooks` | Нет¹ |
| [list_webhooks](#list_webhooks) | `GET /v1/webhooks` | `webhooks` | Нет¹ |
| [list_webhook_deliveries](#list_webhook_deliveries) | `GET /v1/webhooks/deliveries` | `webhooks` | Нет¹ |
| [rotate_webhook](#rotate_webhook) | `POST /v1/webhooks/{id}/rotate` | `webhooks` | Нет¹ |
| [pause_webhook](#pause_webhook) | `POST /v1/webhooks/{id}/pause` | `webhooks` | Нет¹ |
| [resume_webhook](#resume_webhook) | `POST /v1/webhooks/{id}/resume` | `webhooks` | Нет¹ |
| [retry_webhook](#retry_webhook) | `POST /v1/webhooks/deliveries/{id}/retry` | `webhooks` | Нет¹ |
¹ Последующие этапы могут быть платными; см. пояснение выше и биллинг.
## Подключение и возможности
### `list_models` {#list_models}
Получить доступные модели AI
**REST:** `GET /v1/models` · **MCP:** `list_models` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/models' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `capabilities` {#capabilities}
Получить доступные возможности и ограничения
**REST:** `GET /v1/capabilities` · **MCP:** `capabilities` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/capabilities' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `get_integration` {#get_integration}
Прочитать своё подключение и лимиты
**REST:** `GET /v1/integration` · **MCP:** `get_integration` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/integration' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `revoke_integration` {#revoke_integration}
Отозвать собственное подключение
**REST:** `POST /v1/integration/revoke` · **MCP:** `revoke_integration` · **Право:** `read`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/integration/revoke' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Источники и назначения темам
### `delete_source` {#delete_source}
Удалить неиспользуемый источник
**REST:** `DELETE /v1/sources/{id}` · **MCP:** `delete_source` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request DELETE 'https://api.signailist.com/v1/sources/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `get_source_topic_tracking` {#get_source_topic_tracking}
Прочитать назначения источников темам
**REST:** `GET /v1/source-topic-tracking` · **MCP:** `get_source_topic_tracking` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/source-topic-tracking' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `list_sources` {#list_sources}
Получить источники и состояние сбора
**REST:** `GET /v1/sources` · **MCP:** `list_sources` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/sources' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_source` {#create_source}
Создать выключенный Telegram/RSS-источник
**REST:** `POST /v1/sources` · **MCP:** `create_source` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `provider` | Нет | string |
| `title` | Нет | string |
| `url` | Нет | string (uri) |
| `username` | Нет | string |
| `enabled` | Нет | boolean |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"rss",
"telegram"
]
},
"title": {
"type": "string",
"maxLength": 500
},
"url": {
"type": "string",
"format": "uri"
},
"username": {
"type": "string"
},
"enabled": {
"type": "boolean"
}
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"provider": "rss",
"title": "NASA",
"url": "https://www.nasa.gov/news-release/feed/",
"enabled": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/sources' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `update_source` {#update_source}
Изменить источник или приостановить сбор
**REST:** `PATCH /v1/sources/{id}` · **MCP:** `update_source` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"enabled": false
}
```
```bash
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/sources/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `collect_source` {#collect_source}
Запустить сбор источника
**REST:** `POST /v1/sources/{id}/collect` · **MCP:** `collect_source` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/sources/OBJECT_ID/collect' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `prepare_source` {#prepare_source}
Подготовить сохранённые материалы к обработке
**REST:** `POST /v1/sources/{id}/prepare` · **MCP:** `prepare_source` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/sources/OBJECT_ID/prepare' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `track_source_topics` {#track_source_topics}
Назначить источники теме
**REST:** `POST /v1/source-topic-tracking` · **MCP:** `track_source_topics` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"topicId": "TOPIC_ID",
"sourceIds": [
"SOURCE_ID"
],
"enabled": true
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/source-topic-tracking' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `source_status` {#source_status}
Получить состояние анализа источника
**REST:** `GET /v1/sources/{id}/analysis-status` · **MCP:** `source_status` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/sources/OBJECT_ID/analysis-status' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `source_materials` {#source_materials}
Получить сохранённые материалы источника
**REST:** `GET /v1/sources/{id}/materials` · **MCP:** `source_materials` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/sources/OBJECT_ID/materials' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `source_results` {#source_results}
Получить обработанные материалы источника
**REST:** `GET /v1/sources/{id}/results` · **MCP:** `source_results` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/sources/OBJECT_ID/results' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
## Темы анализа
### `list_topics` {#list_topics}
Получить темы анализа
**REST:** `GET /v1/topics` · **MCP:** `list_topics` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/topics' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_topic` {#create_topic}
Создать тему анализа
**REST:** `POST /v1/topics` · **MCP:** `create_topic` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `name` | Да | string |
| `prompt` | Да | string |
| `negativePrompt` | Нет | string |
| `aiModel` | Нет | string |
| `isActive` | Нет | boolean |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"prompt": {
"type": "string",
"minLength": 1
},
"negativePrompt": {
"type": "string"
},
"aiModel": {
"type": "string"
},
"isActive": {
"type": "boolean"
}
},
"required": [
"name",
"prompt"
],
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"name": "Science",
"prompt": "Score factual science news.",
"aiModel": "openai/gpt-6-luna"
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/topics' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `update_topic` {#update_topic}
Изменить тему анализа
**REST:** `PATCH /v1/topics/{id}` · **MCP:** `update_topic` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"name": "Science news"
}
```
```bash
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/topics/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `delete_topic` {#delete_topic}
Удалить тему анализа
**REST:** `DELETE /v1/topics/{id}` · **MCP:** `delete_topic` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request DELETE 'https://api.signailist.com/v1/topics/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Шаблоны дайджеста
### `delete_template` {#delete_template}
Удалить шаблон дайджеста
**REST:** `DELETE /v1/templates/{id}` · **MCP:** `delete_template` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request DELETE 'https://api.signailist.com/v1/templates/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_templates` {#list_templates}
Получить шаблоны дайджеста
**REST:** `GET /v1/templates` · **MCP:** `list_templates` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/templates' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_template` {#create_template}
Создать шаблон дайджеста
**REST:** `POST /v1/templates` · **MCP:** `create_template` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `name` | Да | string |
| `tonePrompt` | Да | string |
| `renderTemplate` | Да | string |
| `sourceId` | Нет | string |
| `imageEnabled` | Нет | boolean |
| `textAiModel` | Нет | string |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"tonePrompt": {
"type": "string",
"minLength": 1,
"maxLength": 20000
},
"renderTemplate": {
"type": "string",
"minLength": 1,
"maxLength": 40000
},
"sourceId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"imageEnabled": {
"type": "boolean"
},
"textAiModel": {
"type": "string"
}
},
"required": [
"name",
"tonePrompt",
"renderTemplate"
],
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"name": "Weekly digest",
"tonePrompt": "Summarize the previous seven days with source links.",
"renderTemplate": "{{ai}}",
"textAiModel": "openai/gpt-6-luna",
"imageEnabled": false,
"periodDays": 7
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/templates' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `update_template` {#update_template}
Изменить шаблон дайджеста
**REST:** `PATCH /v1/templates/{id}` · **MCP:** `update_template` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"textAiModel": "openai/gpt-6-luna"
}
```
```bash
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/templates/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `generate_template` {#generate_template}
Запустить AI-генерацию шаблона
**REST:** `POST /v1/templates/generate` · **MCP:** `generate_template` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/templates/generate' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Дайджесты и AI
### `author_overview` {#author_overview}
Прочитать текущие рубрики, недавние выпуски и квитанции отправок по каналам
**REST:** `GET /v1/author/overview` · **MCP:** `author_overview` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/overview' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `edit_telegram_publication` {#edit_telegram_publication}
Изменить текст отправленной публикации с проверкой текущего текста, сохранив ID и фото
**REST:** `POST /v1/accounts/telegram/{id}/messages/edit` · **MCP:** `edit_telegram_publication` · **Право:** `publish`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `publicationJobId` | Да | string |
| `expectedText` | Да | string |
| `text` | Да | string |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"publicationJobId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"expectedText": {
"type": "string",
"maxLength": 4096
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 8000
}
},
"required": [
"publicationJobId",
"expectedText",
"text"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/accounts/telegram/OBJECT_ID/messages/edit' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `verify_telegram_publications` {#verify_telegram_publications}
Прочитать отправленные публикации для проверки текста и фотографии без отправки сообщений
**REST:** `POST /v1/accounts/telegram/{id}/messages/check` · **MCP:** `verify_telegram_publications` · **Право:** `read`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `publicationJobIds` | Да | array |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"publicationJobIds": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
}
},
"required": [
"publicationJobIds"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/accounts/telegram/OBJECT_ID/messages/check' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `regenerate_author_version` {#regenerate_author_version}
Пересоздать только неопубликованную версию с прежними исходниками и общей картинкой
**REST:** `POST /v1/author/editions/{id}/regenerate-version` · **MCP:** `regenerate_author_version` · **Право:** `run`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `versionId` | Да | string |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"versionId": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"versionId"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/editions/OBJECT_ID/regenerate-version' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `resume_author_edition` {#resume_author_edition}
Продолжить сохранённый выпуск с переиспользованием оплаченных результатов
**REST:** `POST /v1/author/editions/{id}/resume` · **MCP:** `resume_author_edition` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/editions/OBJECT_ID/resume' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `check_telegram_channels` {#check_telegram_channels}
Проверить права публикации и обсуждение без отправки сообщений
**REST:** `POST /v1/accounts/telegram/{id}/channels/check` · **MCP:** `check_telegram_channels` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `channels` | Да | array |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"channels": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"pattern": "^@[a-zA-Z0-9_]{4,32}$"
}
}
},
"required": [
"channels"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/accounts/telegram/OBJECT_ID/channels/check' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `sync_telegram_channels` {#sync_telegram_channels}
Синхронизировать каналы Telegram
**REST:** `POST /v1/accounts/telegram/{id}/channels/sync` · **MCP:** `sync_telegram_channels` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/accounts/telegram/OBJECT_ID/channels/sync' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_content_catalogs` {#list_content_catalogs}
Получить каталоги авторского контента
**REST:** `GET /v1/author/catalogs` · **MCP:** `list_content_catalogs` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/catalogs' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_content_catalog` {#create_content_catalog}
Создать ручной или API-каталог
**REST:** `POST /v1/author/catalogs` · **MCP:** `create_content_catalog` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `kind` | Да | string |
| `title` | Да | string |
| `baseUrl` | Нет | string (uri) |
| `bearerToken` | Нет | string |
| `manifest` | Нет | object |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"api",
"manual"
]
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"baseUrl": {
"type": "string",
"format": "uri"
},
"bearerToken": {
"type": "string",
"maxLength": 2000
},
"manifest": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "number",
"const": 1
},
"id": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"languages": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 2,
"maxLength": 35
}
},
"collections": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
}
}
},
"required": [
"schemaVersion",
"id",
"title",
"languages",
"collections"
],
"additionalProperties": false
}
},
"required": [
"kind",
"title"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/catalogs' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `get_content_catalog` {#get_content_catalog}
Прочитать каталог и статус синхронизации
**REST:** `GET /v1/author/catalogs/{id}` · **MCP:** `get_content_catalog` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/catalogs/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `sync_content_catalog` {#sync_content_catalog}
Проверить и синхронизировать внешний каталог
**REST:** `POST /v1/author/catalogs/{id}/sync` · **MCP:** `sync_content_catalog` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/catalogs/OBJECT_ID/sync' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_catalog_items` {#list_catalog_items}
Получить объекты каталога
**REST:** `GET /v1/author/catalogs/{id}/items` · **MCP:** `list_catalog_items` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/catalogs/OBJECT_ID/items' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `put_catalog_item` {#put_catalog_item}
Сохранить ручной объект с изображениями
**REST:** `PUT /v1/author/catalogs/{id}/items` · **MCP:** `put_catalog_item` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `id` | Да | string |
| `revision` | Да | string |
| `localized` | Да | object |
| `tags` | Да | array |
| `attributes` | Да | object |
| `images` | Да | array |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"revision": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"localized": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
},
"additionalProperties": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 500
},
"description": {
"type": "string",
"maxLength": 30000
}
},
"required": [
"title",
"description"
],
"additionalProperties": false
}
},
"tags": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 100
}
},
"attributes": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"images": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"url": {
"type": "string",
"maxLength": 2048,
"format": "uri"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"mimeType": {
"type": "string",
"enum": [
"image/jpeg",
"image/png",
"image/webp"
]
},
"revision": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 4000
}
},
"required": [
"id",
"url",
"collectionId",
"mimeType",
"revision",
"description"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"revision",
"localized",
"tags",
"attributes",
"images"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request PUT 'https://api.signailist.com/v1/author/catalogs/OBJECT_ID/items' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_author_series` {#list_author_series}
Получить авторские рубрики
**REST:** `GET /v1/author/series` · **MCP:** `list_author_series` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/series' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_author_series` {#create_author_series}
Создать рубрику с версиями и размещениями
**REST:** `POST /v1/author/series` · **MCP:** `create_author_series` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `title` | Да | string |
| `catalogId` | Да | string |
| `config` | Да | object |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"catalogId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"config": {
"type": "object",
"properties": {
"count": {
"default": 2,
"type": "integer",
"minimum": 1,
"maximum": 10
},
"selection": {
"default": "random",
"type": "string",
"enum": [
"random",
"sequential",
"tags"
]
},
"tags": {
"default": [],
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 100
}
},
"repeatWindow": {
"default": 7,
"type": "integer",
"minimum": 0,
"maximum": 365
},
"instruction": {
"type": "string",
"minLength": 1,
"maxLength": 16000
},
"generation": {
"type": "object",
"properties": {
"titles": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
},
"includeItemTitles": {
"default": true,
"type": "boolean"
},
"itemRoles": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"sections": {
"default": [],
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]{1,80}$"
},
"titles": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
},
"instruction": {
"default": "",
"type": "string",
"maxLength": 2000
}
},
"required": [
"id",
"titles",
"instruction"
],
"additionalProperties": false
}
},
"maxCharacters": {
"default": 3000,
"type": "integer",
"minimum": 300,
"maximum": 10000
},
"maxTokens": {
"default": 3200,
"type": "integer",
"minimum": 500,
"maximum": 8000
}
},
"required": [
"titles",
"includeItemTitles",
"itemRoles",
"sections",
"maxCharacters",
"maxTokens"
],
"additionalProperties": false
},
"presentation": {
"type": "object",
"properties": {
"headingEmoji": {
"default": "",
"type": "string",
"maxLength": 16
},
"boldHeading": {
"default": false,
"type": "boolean"
},
"ctaUrl": {
"type": "string",
"format": "uri"
},
"ctaLabels": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 180
}
}
},
"required": [
"headingEmoji",
"boldHeading",
"ctaLabels"
],
"additionalProperties": false
},
"image": {
"type": "object",
"properties": {
"mode": {
"default": "generate",
"type": "string",
"enum": [
"none",
"original",
"album",
"generate"
]
},
"required": {
"default": true,
"type": "boolean"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"model": {
"default": "google/nano-banana-2",
"type": "string",
"enum": [
"google/nano-banana-2",
"google/nano-banana-pro"
]
},
"prompt": {
"default": "Create an original composition based on the supplied subject images. Preserve recognizable subjects. No added text, labels or watermarks.",
"type": "string",
"maxLength": 12000
},
"styleReferenceAssetIds": {
"default": [],
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"required": [
"mode",
"required",
"model",
"prompt",
"styleReferenceAssetIds"
],
"additionalProperties": false
},
"schedule": {
"type": "object",
"properties": {
"kind": {
"default": "daily",
"type": "string",
"enum": [
"daily",
"weekly",
"monthly"
]
},
"time": {
"type": "string"
},
"timezone": {
"type": "string"
},
"weekdays": {
"default": [],
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 7
}
},
"monthDays": {
"default": [],
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 31
}
}
},
"required": [
"kind",
"time",
"timezone",
"weekdays",
"monthDays"
],
"additionalProperties": false
},
"versions": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"language": {
"type": "string",
"pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
},
"templateId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"image": {
"type": "object",
"properties": {
"mode": {
"default": "generate",
"type": "string",
"enum": [
"none",
"original",
"album",
"generate"
]
},
"required": {
"default": true,
"type": "boolean"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"model": {
"default": "google/nano-banana-2",
"type": "string",
"enum": [
"google/nano-banana-2",
"google/nano-banana-pro"
]
},
"prompt": {
"default": "Create an original composition based on the supplied subject images. Preserve recognizable subjects. No added text, labels or watermarks.",
"type": "string",
"maxLength": 12000
},
"styleReferenceAssetIds": {
"default": [],
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"required": [
"mode",
"required",
"model",
"prompt",
"styleReferenceAssetIds"
],
"additionalProperties": false
}
},
"required": [
"id",
"language",
"templateId"
],
"additionalProperties": false
}
},
"placements": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"versionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"targetId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"time": {
"type": "string"
},
"timezone": {
"type": "string"
}
},
"required": [
"id",
"versionId",
"targetId",
"time",
"timezone"
],
"additionalProperties": false
}
}
},
"required": [
"count",
"selection",
"tags",
"repeatWindow",
"instruction",
"image",
"schedule",
"versions",
"placements"
],
"additionalProperties": false
}
},
"required": [
"title",
"catalogId",
"config"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/series' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `get_author_series` {#get_author_series}
Прочитать настройки рубрики
**REST:** `GET /v1/author/series/{id}` · **MCP:** `get_author_series` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/series/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `update_author_series` {#update_author_series}
Изменить будущие выпуски рубрики
**REST:** `PUT /v1/author/series/{id}` · **MCP:** `update_author_series` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `expectedRevision` | Нет | string |
| `title` | Да | string |
| `catalogId` | Да | string |
| `config` | Да | object |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"expectedRevision": {
"type": "string",
"maxLength": 100
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"catalogId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"config": {
"type": "object",
"properties": {
"count": {
"default": 2,
"type": "integer",
"minimum": 1,
"maximum": 10
},
"selection": {
"default": "random",
"type": "string",
"enum": [
"random",
"sequential",
"tags"
]
},
"tags": {
"default": [],
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 100
}
},
"repeatWindow": {
"default": 7,
"type": "integer",
"minimum": 0,
"maximum": 365
},
"instruction": {
"type": "string",
"minLength": 1,
"maxLength": 16000
},
"generation": {
"type": "object",
"properties": {
"titles": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
},
"includeItemTitles": {
"default": true,
"type": "boolean"
},
"itemRoles": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"sections": {
"default": [],
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]{1,80}$"
},
"titles": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
},
"instruction": {
"default": "",
"type": "string",
"maxLength": 2000
}
},
"required": [
"id",
"titles",
"instruction"
],
"additionalProperties": false
}
},
"maxCharacters": {
"default": 3000,
"type": "integer",
"minimum": 300,
"maximum": 10000
},
"maxTokens": {
"default": 3200,
"type": "integer",
"minimum": 500,
"maximum": 8000
}
},
"required": [
"titles",
"includeItemTitles",
"itemRoles",
"sections",
"maxCharacters",
"maxTokens"
],
"additionalProperties": false
},
"presentation": {
"type": "object",
"properties": {
"headingEmoji": {
"default": "",
"type": "string",
"maxLength": 16
},
"boldHeading": {
"default": false,
"type": "boolean"
},
"ctaUrl": {
"type": "string",
"format": "uri"
},
"ctaLabels": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 180
}
}
},
"required": [
"headingEmoji",
"boldHeading",
"ctaLabels"
],
"additionalProperties": false
},
"image": {
"type": "object",
"properties": {
"mode": {
"default": "generate",
"type": "string",
"enum": [
"none",
"original",
"album",
"generate"
]
},
"required": {
"default": true,
"type": "boolean"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"model": {
"default": "google/nano-banana-2",
"type": "string",
"enum": [
"google/nano-banana-2",
"google/nano-banana-pro"
]
},
"prompt": {
"default": "Create an original composition based on the supplied subject images. Preserve recognizable subjects. No added text, labels or watermarks.",
"type": "string",
"maxLength": 12000
},
"styleReferenceAssetIds": {
"default": [],
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"required": [
"mode",
"required",
"model",
"prompt",
"styleReferenceAssetIds"
],
"additionalProperties": false
},
"schedule": {
"type": "object",
"properties": {
"kind": {
"default": "daily",
"type": "string",
"enum": [
"daily",
"weekly",
"monthly"
]
},
"time": {
"type": "string"
},
"timezone": {
"type": "string"
},
"weekdays": {
"default": [],
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 7
}
},
"monthDays": {
"default": [],
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 31
}
}
},
"required": [
"kind",
"time",
"timezone",
"weekdays",
"monthDays"
],
"additionalProperties": false
},
"versions": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"language": {
"type": "string",
"pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
},
"templateId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"image": {
"type": "object",
"properties": {
"mode": {
"default": "generate",
"type": "string",
"enum": [
"none",
"original",
"album",
"generate"
]
},
"required": {
"default": true,
"type": "boolean"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"model": {
"default": "google/nano-banana-2",
"type": "string",
"enum": [
"google/nano-banana-2",
"google/nano-banana-pro"
]
},
"prompt": {
"default": "Create an original composition based on the supplied subject images. Preserve recognizable subjects. No added text, labels or watermarks.",
"type": "string",
"maxLength": 12000
},
"styleReferenceAssetIds": {
"default": [],
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"required": [
"mode",
"required",
"model",
"prompt",
"styleReferenceAssetIds"
],
"additionalProperties": false
}
},
"required": [
"id",
"language",
"templateId"
],
"additionalProperties": false
}
},
"placements": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"versionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"targetId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"time": {
"type": "string"
},
"timezone": {
"type": "string"
}
},
"required": [
"id",
"versionId",
"targetId",
"time",
"timezone"
],
"additionalProperties": false
}
}
},
"required": [
"count",
"selection",
"tags",
"repeatWindow",
"instruction",
"image",
"schedule",
"versions",
"placements"
],
"additionalProperties": false
}
},
"required": [
"title",
"catalogId",
"config"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request PUT 'https://api.signailist.com/v1/author/series/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `set_author_automation` {#set_author_automation}
Включить или приостановить расписание и явную автопубликацию
**REST:** `POST /v1/author/series/{id}/automation` · **MCP:** `set_author_automation` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `enabled` | Да | boolean |
| `autoPublish` | Да | boolean |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"autoPublish": {
"type": "boolean"
}
},
"required": [
"enabled",
"autoPublish"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/series/OBJECT_ID/automation' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `trial_author_series` {#trial_author_series}
Создать платный пробный выпуск без публикации
**REST:** `POST /v1/author/series/{id}/trial` · **MCP:** `trial_author_series` · **Право:** `run`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `intentKey` | Да | string |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"intentKey": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"intentKey"
],
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/series/OBJECT_ID/trial' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_author_editions` {#list_author_editions}
Получить выпуски рубрики
**REST:** `GET /v1/author/series/{id}/editions` · **MCP:** `list_author_editions` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/series/OBJECT_ID/editions' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `get_author_edition` {#get_author_edition}
Прочитать исходники, версии и результаты доставки
**REST:** `GET /v1/author/editions/{id}` · **MCP:** `get_author_edition` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/editions/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `publish_author_edition` {#publish_author_edition}
Утвердить и отправить готовые версии выпуска
**REST:** `POST /v1/author/editions/{id}/publish` · **MCP:** `publish_author_edition` · **Право:** `publish`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `immediate` | Нет | boolean |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"immediate": {
"type": "boolean"
}
},
"additionalProperties": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/editions/OBJECT_ID/publish' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_digests` {#list_digests}
Получить дайджесты
**REST:** `GET /v1/digests` · **MCP:** `list_digests` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/digests' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `digest_candidates` {#digest_candidates}
Выбрать материалы для дайджеста
**REST:** `GET /v1/digest-candidates` · **MCP:** `digest_candidates` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `periodStart` | Да | string (date-time) |
| `periodEnd` | Да | string (date-time) |
| `sourceIds` | Нет | string |
| `q` | Нет | string |
| `ai` | Нет | string |
| `limit` | Нет | integer; default=200; max=500 |
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/digest-candidates?periodStart=2026-10-19T00%3A00%3A00Z&periodEnd=2026-10-26T00%3A00%3A00Z' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_digest` {#create_digest}
Создать черновик из выбранных материалов
**REST:** `POST /v1/digests` · **MCP:** `create_digest` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `templateId` | Да | string |
| `periodStart` | Да | string (date-time) |
| `periodEnd` | Да | string (date-time) |
| `selectedProcessedItemIds` | Да | array |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"templateId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"periodStart": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](https://docs.signailist.com/ru/developers-api?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"periodEnd": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](https://docs.signailist.com/ru/developers-api?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"selectedProcessedItemIds": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
}
},
"required": [
"templateId",
"periodStart",
"periodEnd",
"selectedProcessedItemIds"
],
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"templateId": "TEMPLATE_ID",
"periodStart": "2026-10-19T00:00:00Z",
"periodEnd": "2026-10-26T00:00:00Z",
"selectedProcessedItemIds": [
"PROCESSED_ID"
]
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `get_digest` {#get_digest}
Прочитать дайджест и результат генерации
**REST:** `GET /v1/digests/{id}` · **MCP:** `get_digest` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/digests/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `update_digest` {#update_digest}
Изменить черновик дайджеста
**REST:** `PATCH /v1/digests/{id}` · **MCP:** `update_digest` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/digests/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `generate_digest_text` {#generate_digest_text}
Запустить генерацию текста дайджеста
**REST:** `POST /v1/digests/{id}/generate-text` · **MCP:** `generate_digest_text` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests/OBJECT_ID/generate-text' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `generate_digest_image` {#generate_digest_image}
Запустить генерацию обложки
**REST:** `POST /v1/digests/{id}/generate-image` · **MCP:** `generate_digest_image` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests/OBJECT_ID/generate-image' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `score_material` {#score_material}
Запустить AI-оценку материала
**REST:** `POST /v1/materials/{id}/score` · **MCP:** `score_material` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/materials/OBJECT_ID/score' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Приём материалов
### `create_external_source` {#create_external_source}
Создать приватный внешний источник
**REST:** `POST /v1/external-sources` · **MCP:** `create_external_source` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `title` | Да | string |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 160
}
},
"required": [
"title"
],
"additionalProperties": false
}
```
```json title="Пример тела"
{
"title": "Our system"
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/external-sources' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `ingest_materials` {#ingest_materials}
Принять пакет версионированных материалов
**REST:** `POST /v1/external-sources/{id}/items` · **MCP:** `ingest_materials` · **Право:** `ingest`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `items` | Да | array |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"version": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 1000
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 65536
},
"publishedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](https://docs.signailist.com/ru/developers-api?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"externalId",
"version",
"title",
"text",
"publishedAt"
],
"additionalProperties": false
}
}
},
"required": [
"items"
],
"additionalProperties": false
}
```
```json title="Пример тела"
{
"items": [
{
"externalId": "article-42",
"version": "1",
"title": "Release",
"text": "Release is available.",
"publishedAt": "2026-10-20T12:00:00Z"
}
]
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/external-sources/OBJECT_ID/items' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Провайдеры и назначения
### `list_telegram_accounts` {#list_telegram_accounts}
Получить подключённые аккаунты Telegram
**REST:** `GET /v1/accounts/telegram` · **MCP:** `list_telegram_accounts` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/accounts/telegram' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `list_connections` {#list_connections}
Получить подключения провайдеров без секретов
**REST:** `GET /v1/connections` · **MCP:** `list_connections` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/connections' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_discord_connection` {#create_discord_connection}
Подключить Discord webhook
**REST:** `POST /v1/connections` · **MCP:** `create_discord_connection` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"label": "Our Discord",
"webhookUrl": "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN"
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/connections' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `revoke_connection` {#revoke_connection}
Отозвать подключение провайдера
**REST:** `POST /v1/connections/{id}/revoke` · **MCP:** `revoke_connection` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/connections/OBJECT_ID/revoke' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_targets` {#list_targets}
Получить назначения публикаций
**REST:** `GET /v1/targets` · **MCP:** `list_targets` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/targets' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_target` {#create_target}
Настроить назначение публикации
**REST:** `POST /v1/targets` · **MCP:** `create_target` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"provider": "discord",
"connectionId": "CONNECTION_ID",
"channelTitle": "Our Discord"
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/targets' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `update_target` {#update_target}
Изменить назначение публикации
**REST:** `PATCH /v1/targets/{id}` · **MCP:** `update_target` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/targets/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Расписания и кандидаты
### `delete_schedule` {#delete_schedule}
Удалить расписание
**REST:** `DELETE /v1/schedules/{id}` · **MCP:** `delete_schedule` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request DELETE 'https://api.signailist.com/v1/schedules/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_schedules` {#list_schedules}
Получить расписания публикаций
**REST:** `GET /v1/schedules` · **MCP:** `list_schedules` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/schedules' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_schedule` {#create_schedule}
Создать выключенное расписание
**REST:** `POST /v1/schedules` · **MCP:** `create_schedule` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"name": "Weekly digest",
"triggerMode": "schedule",
"topicId": "TOPIC_ID",
"templateId": "TEMPLATE_ID",
"publicationTargetId": "TARGET_ID",
"schedule": {
"kind": "weekly",
"weekdays": [
1
],
"time": "09:00",
"timezone": "Asia/Tbilisi",
"sourceIds": [
"SOURCE_ID"
]
},
"confirmationMode": "site",
"generateText": true,
"generateImage": false,
"isActive": false,
"clientMutationId": "weekly-setup-1"
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/schedules' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `update_schedule` {#update_schedule}
Изменить расписание
**REST:** `PATCH /v1/schedules/{id}` · **MCP:** `update_schedule` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"name": "Weekly digest"
}
```
```bash
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/schedules/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `enable_schedule` {#enable_schedule}
Включить расписание публикаций
**REST:** `POST /v1/schedules/{id}/enable` · **MCP:** `enable_schedule` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/schedules/OBJECT_ID/enable' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `pause_schedule` {#pause_schedule}
Приостановить расписание
**REST:** `POST /v1/schedules/{id}/pause` · **MCP:** `pause_schedule` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/schedules/OBJECT_ID/pause' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `trigger_schedule` {#trigger_schedule}
Запустить расписание сейчас
**REST:** `POST /v1/schedules/{id}/trigger` · **MCP:** `trigger_schedule` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/schedules/OBJECT_ID/trigger' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_candidates` {#list_candidates}
Получить кандидатов публикации
**REST:** `GET /v1/publication-candidates` · **MCP:** `list_candidates` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/publication-candidates' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `approve_candidate` {#approve_candidate}
Утвердить кандидата публикации
**REST:** `POST /v1/publication-candidates/{id}/approve` · **MCP:** `approve_candidate` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/publication-candidates/OBJECT_ID/approve' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `reject_candidate` {#reject_candidate}
Отклонить кандидата публикации
**REST:** `POST /v1/publication-candidates/{id}/reject` · **MCP:** `reject_candidate` · **Право:** `publish`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/publication-candidates/OBJECT_ID/reject' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Документы и доставка публикаций
### `list_publications` {#list_publications}
Получить историю публикаций
**REST:** `GET /v1/publications` · **MCP:** `list_publications` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/publications' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `get_document` {#get_document}
Прочитать документ, ревизию и предпросмотр
**REST:** `GET /v1/digests/{id}/document` · **MCP:** `get_document` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/digests/OBJECT_ID/document' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `save_document` {#save_document}
Сохранить документ с expectedRevision
**REST:** `PUT /v1/digests/{id}/document` · **MCP:** `save_document` · **Право:** `configure`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `expectedRevision` | Да | integer |
| `document` | Да | object |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"expectedRevision": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"document": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"expectedRevision",
"document"
],
"additionalProperties": false
}
```
```json title="Пример тела"
{
"expectedRevision": 0,
"document": {
"schemaVersion": 1,
"id": "DOCUMENT_ID",
"workspaceId": "CONNECTED_WORKSPACE_ID",
"revision": 1,
"title": null,
"blocks": [
{
"type": "paragraph",
"text": "Reviewed text."
}
],
"attribution": null,
"sources": []
}
}
```
```bash
curl --fail-with-body --request PUT 'https://api.signailist.com/v1/digests/OBJECT_ID/document' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `approve_document` {#approve_document}
Утвердить точную ревизию документа
**REST:** `POST /v1/digests/{id}/approve` · **MCP:** `approve_document` · **Право:** `publish`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `revision` | Да | integer |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"revision": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"revision"
],
"additionalProperties": false
}
```
```json title="Пример тела"
{
"revision": 1
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests/OBJECT_ID/approve' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `publish_document` {#publish_document}
Отправить утверждённую ревизию в назначения
**REST:** `POST /v1/digests/{id}/publish` · **MCP:** `publish_document` · **Право:** `publish`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `revision` | Да | integer |
| `targetIds` | Да | array |
| `logicalPublicationId` | Да | string |
| `scheduledAt` | Нет | string (date-time) |
| `publisherAccountId` | Нет | string |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"revision": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"targetIds": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"logicalPublicationId": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"scheduledAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](https://docs.signailist.com/ru/developers-api?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"publisherAccountId": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"revision",
"targetIds",
"logicalPublicationId"
],
"additionalProperties": false
}
```
```json title="Пример тела"
{
"revision": 1,
"targetIds": [
"TARGET_ID"
],
"logicalPublicationId": "weekly-2026-10-26"
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests/OBJECT_ID/publish' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `get_delivery` {#get_delivery}
Прочитать квитанции доставки публикации
**REST:** `GET /v1/deliveries/{id}` · **MCP:** `get_delivery` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/deliveries/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `retry_delivery` {#retry_delivery}
Повторить доставку с учётом риска дубля
**REST:** `POST /v1/deliveries/{id}/retry` · **MCP:** `retry_delivery` · **Право:** `publish`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `acknowledgeDuplicateRisk` | Нет | boolean |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"acknowledgeDuplicateRisk": {
"type": "boolean"
}
},
"additionalProperties": false
}
```
```json title="Пример тела"
{
"acknowledgeDuplicateRisk": false
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/deliveries/OBJECT_ID/retry' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `cancel_publication` {#cancel_publication}
Отменить ожидающую публикацию
**REST:** `POST /v1/publications/{id}/cancel` · **MCP:** `cancel_publication` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/publications/OBJECT_ID/cancel' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Задания
### `list_jobs` {#list_jobs}
Получить задания очереди
**REST:** `GET /v1/jobs` · **MCP:** `list_jobs` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/jobs' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `cancel_job` {#cancel_job}
Отменить ожидающее задание
**REST:** `POST /v1/jobs/{id}/cancel` · **MCP:** `cancel_job` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/jobs/OBJECT_ID/cancel' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `get_job` {#get_job}
Прочитать состояние задания
**REST:** `GET /v1/jobs/{id}` · **MCP:** `get_job` · **Право:** `read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/jobs/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
## Ассеты
### `list_assets` {#list_assets}
Получить сохранённые изображения
**REST:** `GET /v1/assets` · **MCP:** `list_assets` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/assets' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `upload_asset` {#upload_asset}
Загрузить изображение
**REST:** `POST /v1/assets` · **MCP:** `upload_asset` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/assets' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Сигналы
### `list_signals` {#list_signals}
Получить правила сигналов и уведомлений
**REST:** `GET /v1/signals` · **MCP:** `list_signals` · **Право:** `read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/signals' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `create_signal` {#create_signal}
Создать выключенное правило уведомлений
**REST:** `POST /v1/signals` · **MCP:** `create_signal` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/signals' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `update_signal` {#update_signal}
Изменить правило уведомлений
**REST:** `PATCH /v1/signals/{id}` · **MCP:** `update_signal` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```bash
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/signals/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `enable_signal` {#enable_signal}
Включить правило уведомлений
**REST:** `POST /v1/signals/{id}/enable` · **MCP:** `enable_signal` · **Право:** `run`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/signals/OBJECT_ID/enable' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `pause_signal` {#pause_signal}
Приостановить правило уведомлений
**REST:** `POST /v1/signals/{id}/pause` · **MCP:** `pause_signal` · **Право:** `configure`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/signals/OBJECT_ID/pause' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Исходящие вебхуки
### `create_webhook` {#create_webhook}
Создать подписку исходящих вебхуков
**REST:** `POST /v1/webhooks` · **MCP:** `create_webhook` · **Право:** `webhooks`
| Поле тела | Обязательно | Тип |
| --- | --- | --- |
| `name` | Да | string |
| `url` | Да | string (uri) |
| `events` | Да | array |
| `includeResult` | Нет | boolean |
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"url": {
"type": "string",
"format": "uri"
},
"events": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"includeResult": {
"type": "boolean"
}
},
"required": [
"name",
"url",
"events"
],
"additionalProperties": false
}
```
```json title="Пример тела"
{
"name": "Result receiver",
"url": "https://receiver.example.com/signailist",
"events": [
"processing.completed"
],
"includeResult": true
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `list_webhooks` {#list_webhooks}
Получить подписки вебхуков
**REST:** `GET /v1/webhooks` · **MCP:** `list_webhooks` · **Право:** `webhooks`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/webhooks' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `list_webhook_deliveries` {#list_webhook_deliveries}
Получить историю доставки вебхуков
**REST:** `GET /v1/webhooks/deliveries` · **MCP:** `list_webhook_deliveries` · **Право:** `webhooks`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/webhooks/deliveries' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `rotate_webhook` {#rotate_webhook}
Сменить секрет подписи вебхука
**REST:** `POST /v1/webhooks/{id}/rotate` · **MCP:** `rotate_webhook` · **Право:** `webhooks`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks/OBJECT_ID/rotate' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `pause_webhook` {#pause_webhook}
Приостановить доставку вебхука
**REST:** `POST /v1/webhooks/{id}/pause` · **MCP:** `pause_webhook` · **Право:** `webhooks`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks/OBJECT_ID/pause' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `resume_webhook` {#resume_webhook}
Возобновить доставку вебхука
**REST:** `POST /v1/webhooks/{id}/resume` · **MCP:** `resume_webhook` · **Право:** `webhooks`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks/OBJECT_ID/resume' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
### `retry_webhook` {#retry_webhook}
Повторить неуспешную платную доставку вебхука
**REST:** `POST /v1/webhooks/deliveries/{id}/retry` · **MCP:** `retry_webhook` · **Право:** `webhooks`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks/deliveries/OBJECT_ID/retry' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Биллинг и резервы
### `billing_summary` {#billing_summary}
Прочитать баланс и расходы workspace
**REST:** `GET /v1/billing/summary` · **MCP:** `billing_summary` · **Право:** `billing:read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `from` | Нет | string (date-time) |
| `to` | Нет | string (date-time) |
| `days` | Нет | integer; default=30; max=3650 |
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/billing/summary' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `billing_usage` {#billing_usage}
Получить историю расходов
**REST:** `GET /v1/billing/usage` · **MCP:** `billing_usage` · **Право:** `billing:read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `from` | Нет | string (date-time) |
| `to` | Нет | string (date-time) |
| `days` | Нет | integer; default=30; max=3650 |
| `page` | Нет | integer; default=1 |
| `pageSize` | Нет | integer; default=20; max=200 |
| `groupBy` | Нет | string |
| `operation` | Нет | string |
| `platform` | Нет | string |
| `sourceId` | Нет | string |
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/billing/usage' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `list_reservations` {#list_reservations}
Получить резервы и прерванные операции
**REST:** `GET /v1/reservations` · **MCP:** `list_reservations` · **Право:** `billing:read`
| Query-поле | Обязательно | Формат |
| --- | --- | --- |
| `cursor` | Нет | string |
| `limit` | Нет | integer; default=50; max=100 |
Ответ: `{ items, nextCursor }`. Передайте nextCursor в cursor следующего запроса; null означает конец.
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/reservations' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `budget` {#budget}
Прочитать баланс, резервы и доступную сумму
**REST:** `GET /v1/budget` · **MCP:** `budget` · **Право:** `billing:read`
```bash
curl --fail-with-body --request GET 'https://api.signailist.com/v1/budget' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"
```
### `estimate` {#estimate}
Оценить стоимость по реестру биллинга
**REST:** `POST /v1/estimates` · **MCP:** `estimate` · **Право:** `billing:read`
Тело: JSON-объект общего обработчика; конкретные write-поля см. в сценариях и примере ниже. Общая схема не исчерпывает бизнес-проверки.
JSON Schema тела
```json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
```
```json title="Пример тела"
{
"operation": "generateDigest",
"model": "openai/gpt-6-luna",
"usage": {
"inputTokens": 1000,
"outputTokens": 500
}
}
```
```bash
curl --fail-with-body --request POST 'https://api.signailist.com/v1/estimates' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
В MCP передайте те же поля в body, ID объекта отдельно в id (если он есть в пути), а постоянный ключ — в idempotencyKey. В REST ID должен быть закодирован для URL. Одноразовые секреты исключаются из повторного ответа.
## Авторизация и служебные публичные адреса
Это HTTP-адреса протокола и схем, а не дополнительные бизнес-инструменты. Административные и session-only маршруты сайта не входят в публичный REST API.
| Method | URL/path | Purpose |
| --- | --- | --- |
| GET | `/.well-known/oauth-protected-resource` | OAuth resource metadata |
| GET | `/.well-known/oauth-authorization-server` | OAuth server metadata |
| POST | `/oauth/register` | Dynamic client registration |
| GET | `/oauth/authorize` | Browser sign-in/consent redirect |
| POST | `/oauth/token` | Code/refresh token exchange |
| POST | `/oauth/revoke` | Token revocation |
| POST | `/mcp` | Authenticated MCP JSON-RPC, not an arbitrary REST proxy |
| GET | `/v1/openapi.json` | Public API specification |
Относительные адреса относятся к https://api.signailist.com. Владелец создаёт ключи, задаёт финансовые лимиты и разбирает зависшие резервы в интерфейсе интеграций. Эти привилегированные действия не выдаются агенту как способ повысить свой доступ.
---
# Готовые промпты и сценарии интеграций
Canonical page: https://docs.signailist.com/ru/developers-recipes
Каждый промпт можно скопировать целиком кнопкой у блока. Замените значения в квадратных скобках своими; не вставляйте пароли, API-ключи и секреты вебхуков в чат. [Индекс](https://docs.signailist.com/llms.txt), [полная документация RU](https://docs.signailist.com/llms-full-ru.txt) и [OpenAPI](https://docs.signailist.com/openapi.json) помогают агенту читать контракты вместо угадывания маршрутов.
## Еженедельный дайджест: сначала настройка
```text
Через MCP Signailist подготовь еженедельный дайджест в подключённом workspace.
Прочитай https://docs.signailist.com/llms.txt и
https://docs.signailist.com/ru/developers-recipes.
Контракты запросов и инструментов: https://docs.signailist.com/ru/developers-api
и https://docs.signailist.com/openapi.json.
Вся документация: https://docs.signailist.com/llms-full-ru.txt.
Тема: [тема]. Источники: [URL или названия существующих источников].
Расписание: понедельник, 09:00, Asia/Tbilisi, новости за предыдущие семь дней.
Результат: на русском, до 7 важных новостей, короткое фактическое изложение и ссылка
на источник для каждой. Используй openai/gpt-6-luna, если она есть в list_models;
иначе покажи доступные модели и попроси выбрать. Без изображений.
Назначение: [существующий канал Telegram или Discord]. Отправка после утверждения.
Сначала вызови capabilities, get_integration и budget. Прочитай источники, темы,
шаблоны, назначения и расписания. Используй подходящие существующие объекты,
не создавай дубли. Если источник или канал неоднозначны — попроси меня выбрать.
Настрой шаблон с textAiModel и periodDays=7, назначения источников темам и weekly
расписание по документированным полям. Новые источники и расписание сохрани
выключенными. Покажи имена/ID, готовность материалов, часовой пояс, ближайшее
плановое время и оставшиеся шаги. До предложения платной пробы проверь оценку
расходов и объясни, что это оценка, а не гарантированная цена.
На этом шаге не включай сбор, AI, публикацию или расписание.
```
Агент читает `list_sources`, `list_topics`, `get_source_topic_tracking`, `list_templates`, `list_targets`, `list_schedules`, затем при необходимости вызывает `create_template`, `track_source_topics`, `create_schedule`. В списках встречаются имена полей хранения, например `is_active`; для записи используйте поля write-контракта. `list_schedules` возвращает строки правил, а ответ создания/изменения содержит вложенное расписание. Сохраните этот ответ для часового пояса и ближайшего запуска.
Пример тела weekly-расписания. Все `*_ID` замените настоящими ID из этого workspace; ближайший запуск вычисляет сервер.
```json title="Тело create_schedule"
{
"name": "Еженедельный дайджест",
"triggerMode": "schedule",
"topicId": "TOPIC_ID",
"templateId": "TEMPLATE_ID",
"publicationTargetId": "TARGET_ID",
"minAiScore": 0.5,
"schedule": {
"kind": "weekly",
"weekdays": [1],
"time": "09:00",
"timezone": "Asia/Tbilisi",
"sourceIds": ["SOURCE_ID"]
},
"confirmationMode": "site",
"generateText": true,
"generateImage": false,
"checkPublishedDuplicates": true,
"isActive": false,
"clientMutationId": "weekly-digest-setup-1"
}
```
ISO-дни недели: понедельник `1`, воскресенье `7`. Подключённое назначение обязательно и для правила с утверждением. Discord использует `confirmationMode: "site"`. Период шаблона, выбор источников и состояние сбора должны соответствовать задаче; без сохранённых материалов не будет входных данных для дайджеста.
## Пробный выпуск и включение расписания
После проверки настроек дайте отдельную команду, определяющую разрешённую платную работу:
```text
Для настроенного еженедельного дайджеста Signailist покажи источники, доступный
бюджет и оценку пробного выпуска. Если права и баланс позволяют, включи сбор
выбранных источников, собери и подготовь материалы. Дождись готовности источников
и AI-заданий; принятие в очередь не считай завершением.
Создай один черновик из настоящих ID обработанных материалов и один раз сгенерируй
текст, без изображений и публикации. Используй постоянные ключи идемпотентности;
после таймаута проверяй существующее задание, а не создавай новую платную операцию.
Покажи черновик, фактические расходы и ошибки. Расписание оставь выключенным.
```
Когда готовы к регулярной работе:
```text
Включи существующее еженедельное расписание [название/ID] в Signailist с ранее
проверенными источниками, назначением, часовым поясом и режимом утверждения.
Сначала проверь право publish и наличие подходящих лимитов, заданных владельцем.
Не создавай расписание заново и не увеличивай бюджет. Сохрани утверждение публикаций.
Покажи отдельно состояние сбора, состояние расписания и ближайший запуск.
```
Если `publish` отсутствует, его выдаёт владелец; агент не повышает собственные права. Включение расписания не утверждает документ. Для отправки черновика прочитайте `get_document`, сохраните изменения с `expectedRevision`, утвердите последнюю точную ревизию и вызовите `publish_document` с постоянным `logicalPublicationId`. Повторная генерация сбрасывает прежнее утверждение. При неопределённом результате проверьте `get_delivery` и сам канал; новый ключ идемпотентности не защищает от дубля публикации.
## Подключение внешней системы
```text
Помоги интегрировать мою систему с Signailist.
Прочитай https://docs.signailist.com/llms.txt,
https://docs.signailist.com/ru/developers-api и
https://docs.signailist.com/ru/developers-webhooks.
Контракт запросов: https://docs.signailist.com/openapi.json.
Система: [система]. Поля текстового материала: [поля].
Получатель результата: [публичный HTTPS URL]. Результат: [обработанный текст или AI-дайджест].
Проверь существующие настройки и бюджет. Предложи отображение полей в externalId,
version, title, text и publishedAt. Подготовь приватный external-источник и подписку
processing.completed с includeResult=true, переиспользуя подходящие объекты.
Попроси владельца выдать REST-ключ ingest, ограниченный этим источником.
Не запрашивай секреты в чате и не сохраняй их в Git.
Подготовь код: секреты из переменных окружения, JSON-пакеты до 50 материалов,
постоянный Idempotency-Key, сохранение результата каждого элемента, проверка HMAC
по timestamp и исходному телу, дедупликация событий по ID.
Объясни, что processing.completed означает предварительную обработку, а не
обязательно завершённую AI-оценку. Не загружай реальные данные и не запускай
платную работу до моего разрешения пробного запуска.
```
Готовые файлы: [curl приёма данных](https://docs.signailist.com/examples/integrations/intake.sh), [клиент TypeScript](https://docs.signailist.com/examples/integrations/client.ts), [клиент Python](https://docs.signailist.com/examples/integrations/client.py), [проверка подписи](https://docs.signailist.com/examples/integrations/verify.py). Ключ приёма предназначен для REST; ограниченный источником ключ не настраивает источник и не управляет вебхуками.
## Публикация в пределах бюджета
```text
Через MCP Signailist подготовь отправку [ID дайджеста] в [назначение].
Прочитай https://docs.signailist.com/ru/developers-api и
https://docs.signailist.com/ru/billing. Проверь права, бюджет, состояние задания,
последнюю ревизию документа и предпросмотр провайдера. Используй существующие
суточные лимиты владельца и не меняй их. Если не хватает права, баланса или
подключения провайдера, укажи точный оставшийся шаг настройки.
После моего разрешения отправить утверди проверенную последнюю ревизию и отправь
один раз с постоянными logicalPublicationId и ключом идемпотентности. Проверь
квитанцию; неопределённый результат не повторяй без проверки канала и явного
принятия риска дубля. Покажи результат и фактические списания ledger.
```
Полностью автоматическая публикация требует явного права публикации и совместимых провайдера/режима утверждения. Расписание выполняется на стороне Signailist: чат агента не обязан оставаться открытым. Отзыв доступа провайдером или недостаточный баланс могут остановить работу и потребовать действий владельца.
---
# Приём данных и исходящие вебхуки
Canonical page: https://docs.signailist.com/ru/developers-webhooks
Приватный external-источник принимает текст вашей системы, а исходящие вебхуки сообщают об изменениях состояния. Загрузки собственного исполняемого кода здесь нет. REST использует API-ключ workspace; MCP — отдельное OAuth-подключение. [Все запросы](https://docs.signailist.com/ru/developers-api).
## Передать текстовые материалы
Создайте источник через `POST /v1/external-sources`, затем отправляйте материалы в `/v1/external-sources/{id}/items`. Для настройки используйте ключ владельца, а для передающей системы — отдельный `ingest`-ключ, ограниченный этим источником.
```json title="Тело ingest_materials"
{
"items": [{
"externalId": "article-42",
"version": "1",
"title": "Заметки о выпуске",
"text": "Выпуск доступен.",
"publishedAt": "2026-10-20T12:00:00Z",
"url": "https://example.com/releases/42",
"metadata": {"category": "release"}
}]
}
```
Обязательны `externalId`, `version`, `title`, `text`, `publishedAt`; время — ISO 8601 с часовым поясом. URL и JSON-метаданные необязательны. Ограничения: 50 элементов в пакете, 65 536 символов текста на элемент, 1 000 символов заголовка, 16 КиБ метаданных, 1 МиБ тела запроса. Изображения передаются отдельной загрузкой ассетов, а не бинарными данными в `text`.
Принятый HTTP-запрос может содержать отклонённые элементы. Проверяйте каждый `items[index]`: у `accepted` есть `id` сырого материала и `jobId`; `duplicate` ссылается на сохранённую версию; `rejected` содержит код. `jobId` в квитанции может появиться раньше строки workspace-задания, пока отправляется durable outbox. В этот промежуток проверяйте также результаты и состояние источника.
Дедупликация: workspace + источник + внешний ID + версия. Повтор сохранённой версии не запускает новую обработку и списание за приём. Изменённое содержимое с прежней версией конфликтует; для настоящего обновления передайте новую версию. После таймаута повторяйте исходный запрос с прежним ключом, а не создавайте новую версию из-за сетевой ошибки.
## Подписаться на результат
```json title="Тело create_webhook"
{
"name": "Получатель результатов",
"url": "https://receiver.example.com/signailist",
"events": ["processing.completed", "digest.ready", "publication.sent"],
"includeResult": true
}
```
В примере адрес-заглушка: замените его публичным HTTPS endpoint своей системы. Сразу сохраните полученный секрет подписи в хранилище секретов — он показывается один раз. Идемпотентный повтор ответа сохраняет ID подписки, но не возвращает секрет. Если первый ответ потерян, выполните ротацию.
| Событие | Значение |
| --- | --- |
| `processing.completed` | Предварительная обработка сохранена; готовность последующего AI проверяется отдельно |
| `processing.failed` | Ошибка workspace-задания обработки/AI; проверьте задание |
| `digest.ready` | Дайджест перешёл в состояние готовности/проверки; это не квитанция публикации |
| `approval.required` | Кандидат публикации ожидает утверждения |
| `publication.sent` | Доставка публикации перешла в sent |
| `publication.failed` | Ошибка доставки публикации |
| `publication.unknown` | Результат провайдера не подтверждён; автоматически не отправляйте заново |
| `source.failed` | Источник перешёл в состояние ошибки |
| `balance.low` | Баланс пересёк USD 1 вниз |
| `balance.depleted` | Баланс пересёк ноль вниз |
| `limit.reached` | Лимит workspace или подключения остановил платный этап |
Конверт содержит `schemaVersion`, `id`, `type`, `createdAt`, `workspaceId`, `objectId`, `data`. При `includeResult: false` данные краткие — ссылка/состояние объекта; при `true` — снимок результата на момент перехода. Несколько событий одного объекта могут обозначать разные переходы. Для текущего состояния прочитайте объект через REST/MCP, а не полагайтесь на старый снимок.
## Проверить, сохранить и подтвердить
Заголовки: `Signailist-Event-Id`, `Signailist-Timestamp` (Unix seconds), `Signailist-Signature`. HMAC-SHA256 вычисляется по UTF-8 timestamp, точке и точным исходным байтам тела. Подпись — hex с префиксом `v1=`. Сравнивайте за постоянное время и отклоняйте timestamp дальше пяти минут от ваших часов; синхронизируйте часы сервера. После проверки подписи сверьте ID заголовка и конверта.
[Скачать Python-проверку подписи](https://docs.signailist.com/examples/integrations/verify.py). Не проверяйте подпись по заново сериализованному JSON: пробелы и порядок ключей могут измениться. При ротации старый и новый секреты действуют совместно 24 часа; заголовок может содержать несколько подписей через запятую. В период перехода принимайте корректную подпись от любого из доверенных секретов.
Надёжно сохраните проверенное событие и ID дедупликации, затем быстро верните любой `2xx`. Тяжёлую работу поставьте в свою очередь. Если сохранить событие нельзя, верните ошибку для повторной доставки. Гарантия — **минимум один раз**, возможны дубликаты и другой порядок. Не выполняйте незащищённый внешний эффект до сохранения дедупликации.
## Повторы, биллинг и восстановление
До восьми попыток в течение суток с увеличением интервала, затем ошибка доставки. `list_webhook_deliveries` / `GET /v1/webhooks/deliveries` показывают состояние, число попыток и последний HTTP-результат. `retry_webhook` перезапускает неуспешное платное уведомление; `{ "ok": true }` подтверждает запрос, но не успешный приём получателем. При повторах ID события сохраняется. История хранится 30 дней.
Физические попытки расходуют общий баланс, включая ошибки HTTP. Повтор клиентского запроса сам по себе повторного списания не создаёт. Уведомления об исчерпании баланса/лимите имеют ограниченную бесплатную доставку — максимум три попытки на событие; её нельзя перезапускать как платную доставку. Подробнее в [биллинге](https://docs.signailist.com/ru/billing).
Принимаются только публичные HTTPS-адреса. Credentials в URL, внутренние адреса и небезопасные DNS-ответы запрещены. Перенаправления не выполняются: при смене адреса обновите конфигурацию. Пауза подписки останавливает доставку, но сохраняет историю.
Повтор исходящего вебхука не равен повторной публикации: событие `publication.unknown` требует проверки назначения, а не новой отправки публикации.