SkyStream API

Чат-панель

Сообщения от имени аккаунтов панели, аккаунты, опросы, предсказания и награды канала, ссылка общего доступа.

Чат-панель — это аккаунты сервиса, подключённые к чату канала, от имени которых пишете вы. Через API с ней можно делать всё то же, что в панели: писать с выбранного аккаунта или по очереди со всех, следить за аккаунтами и подписывать их на канал, голосовать в опросах и ставить баллы канала, выдавать ссылку модератору.

Чтение состояния доступно любому ключу. Для действий нужно право chat_panel; ссылку общего доступа тоже выдаёт только ключ с ним.

Заказать и дождаться подключения

Панель заказывается так же, как другие услуги, — POST /orders/chat-panel, см. Заказ услуг со счёта. Id заказа — он же id панели во всех запросах ниже: cp_8.

Аккаунты подключаются к чату в фоне, первые минуты после заказа. Пока это идёт, status панели — connecting, а connecting показывает ход; писать уже можно с подключённых аккаунтов.

GET/chat-panels/cp_8
curl https://api.skystream.su/app/v1/chat-panels/cp_8 \  -H "Authorization: Bearer $API_KEY"
bash, zshКлюч — в переменной API_KEY
Ответ200
{  "id": "cp_8",  "platform": "twitch",  "channel": "example_channel",  "status": "ready",  "ends_at": "2026-10-05T20:39:20.000Z",  "auto_switch": true,  "current_account": "fox_runner",  "total_sent": 25,  "connecting": null,  "channel_restrictions": {    "followers_only": true,    "followers_only_minutes": 0,    "subs_only": false,    "emote_only": false,    "slow_seconds": 0,    "account_age_minutes": null  },  "chatroom_id": null,  "is_live": null,  "last_send_error": null,  "accounts": [    {      "login": "fox_runner",      "state": "ready",      "restriction": null,      "restricted_until": null,      "messages_sent": 14,      "current": true,      "pinned": true    },    {      "login": "pixel_mira",      "state": "restricted",      "restriction": "followers_only",      "restricted_until": null,      "messages_sent": 0,      "current": false,      "pinned": false    }  ]}

Состояние меняется само: аккаунты отваливаются, получают ограничения и заменяются. Панель в браузере перечитывает его раз в 3 секунды, пока идёт подключение, и раз в 15 секунд потом — так же стоит делать интеграции. Событий и вебхуков по чат-панели нет.

statusЧто значит
connectingАккаунты подключаются; писать можно с подключённых
readyПодключение закончено
pausedTwitch: канал не в эфире, аккаунты отключены и подключатся сами с началом эфира. Список accounts в это время пуст, а отправка и любой запрос с логином аккаунта отклоняются с ошибкой 409 channel_offline

Аккаунты

Аккаунт панели адресуется логином: и в ответах, и в запросах (account, /accounts/{login}). Аккаунт, который не может писать по своей вине, панель заменяет сама, и в списке появляется другой логин. Запрос с логином, которого уже нет, отклоняется с ошибкой 404 account_not_in_panel — перечитайте состояние.

stateЧто значитЧто делать
readyМожет писать—
restrictedМешает режим канала: только для фолловеров или подписчиковПодписать аккаунт на канал или дождаться смены режима
unusableБан, проверка, скрытие сообщений — проблема самого аккаунтаНичего: панель заменит его
disconnectedНет связи с чатомОбычно проходит само

Причина ограничения — в restriction, коды — в разделе Почему сообщение не ушло.

Подробности об аккаунтах — подписку на канал, баллы канала, значки, писал ли аккаунт в этот чат — отдаёт отдельный запрос, по параметру include:

GET/chat-panels/cp_8/accounts?include=following%2Cpoints
curl "https://api.skystream.su/app/v1/chat-panels/cp_8/accounts?include=following%2Cpoints" \  -H "Authorization: Bearer $API_KEY"
bash, zshКлюч — в переменной API_KEY

Каждая подробность — запрос к площадке на каждый аккаунт, поэтому ответ может идти десятки секунд, а сам запрос считается по пределу частоты изменений. Просите только нужное. Баллы, значки и has_chatted есть только у Twitch.

Подписать на канал

Если канал в режиме «только для фолловеров», аккаунт с restriction: followers_only нужно подписать на канал:

POST/chat-panels/cp_8/accounts/pixel_mira/follow
curl https://api.skystream.su/app/v1/chat-panels/cp_8/accounts/pixel_mira/follow \  -X POST \  -H "Authorization: Bearer $API_KEY"
bash, zshКлюч — в переменной API_KEY
Ответ200
{  "account": "pixel_mira",  "status": "following"}

Подписка идёт через площадку и может занять больше минуты, а API ждёт не дольше 25 секунд. Если не дождался, ответ — status: pending: подписка продолжается, итог проверьте позже запросом GET /chat-panels/cp_8/accounts?include=following. failed — площадка не дала подписаться; если аккаунт непригоден, панель заменит его сама, иначе повторите запрос позже.

Закрепить

Закреплённые аккаунты панель показывает первыми. PUT /chat-panels/{id}/accounts/{login}/pin закрепляет, DELETE того же адреса — снимает. Порядок отправки закрепление не меняет.

Отправить сообщение

POST/chat-panels/cp_8/messages
curl https://api.skystream.su/app/v1/chat-panels/cp_8/messages \  -X POST \  -H "Authorization: Bearer $API_KEY" \  -H "Content-Type: application/json" \  -d '{    "text": "Привет, чат!"  }'
bash, zshКлюч — в переменной API_KEY
Ответ200
{  "sent": true,  "account": "fox_runner",  "message_id": null,  "reason": null,  "retry_after_ms": null,  "current_account": "night_owl_77",  "total_sent": 26}

Без account сообщение уходит с текущего аккаунта (current_account), с account — с указанного. Если включена авто-ротация, после каждой отправки текущим становится следующий за отправителем годный аккаунт — так сообщения без account идут от разных людей. Новый текущий аккаунт — в current_account ответа.

Текст — до 500 знаков; переводы строк заменяются пробелами. Чтобы ответить на сообщение в чате, передайте его id в reply_to.

Повтор отправляет второй раз

Сообщение — не идемпотентное действие: повтор запроса отправит его снова. Чтобы повтор после обрыва связи был безопасен, передавайте заголовок Idempotency-Key — см. Идемпотентность.

Со всех аккаунтов сразу — POST /chat-panels/{id}/broadcast с тем же text. Ответ — итог по каждому аккаунту.

Почему сообщение не ушло

Если площадка не приняла сообщение или писать некому, ответ — тоже 200, но с sent: false и причиной в reason. Это исход отправки, а не ошибка запроса: аккаунт уже назван, и ротация уже сдвинута.

Ответ200Фрагмент ответа
{  "sent": false,  "account": "fox_runner",  "reason": "msg_duplicate"}
reasonЧто значит
followers_only, subs_onlyКанал пускает в чат только фолловеров или подписчиков. Подпишите аккаунты
msg_emoteonlyКанал в режиме «только эмодзи»
channel_sideСообщения скрывает фильтр канала — от любого аккаунта
msg_duplicate, msg_r9kТот же текст недавно уже был. Измените текст
msg_ratelimit, msg_slowmodeСлишком часто. У Kick в медленном чате retry_after_ms — сколько ждать
msg_rejectedСообщение задержал AutoMod или модерация канала
msg_too_longТекст длиннее, чем принимает площадка
reply_not_foundСообщение, на которое ответ, уже удалено
banned, msg_timedout, requires_challenge, phone_required, email_required, token_invalid, account_too_new, shadow_droppedПроблема аккаунта. Панель заменит его; повторите с другого
blocked, networkСбой связи с площадкой. Повторите позже
no_usable_accountsПисать некому: все аккаунты ограничены или отключены
account_unavailableВыбранный аккаунт сейчас не может писать, а замены ещё нет
unknownПричина, которой нет в списке. Новые причины могут появляться — обрабатывайте неизвестные как unknown

Twitch сообщает о части отказов (повтор, лимит, AutoMod) уже после ответа на отправку — такая отправка вернула sent: true. Последний такой отказ виден в last_send_error состояния панели: время, аккаунт и причина.

Читать чат

API не пересказывает чат: панель в браузере читает его прямо у площадки, и интеграции стоит делать так же — это быстрее любого опроса.

  • Twitch — IRC по WebSocket wss://irc-ws.chat.twitch.tv:443 без авторизации: PASS SCHMOOPIIE, NICK justinfan12345 (любое число), CAP REQ :twitch.tv/tags twitch.tv/commands, JOIN #<канал>. Тег id у сообщения — то, что передаётся в reply_to.
  • Kick — Pusher: ключ 32cbd69e4b950bf97679, кластер us2, канал chatrooms.<chatroom_id>.v2, событие App\Events\ChatMessageEvent. chatroom_id — в состоянии панели. Последние сообщения отдаёт и API:
GET/chat-panels/cp_9/messages?limit=50
curl "https://api.skystream.su/app/v1/chat-panels/cp_9/messages?limit=50" \  -H "Authorization: Bearer $API_KEY"
bash, zshКлюч — в переменной API_KEY

У Twitch истории через API нет: запрос отклоняется с ошибкой 400 platform_not_supported.

Опросы, предсказания и награды

Только у Twitch. Всё, что тратит баллы канала, необратимо.

Опрос

GET /chat-panels/{id}/poll — опрос канала со счётом и голоса аккаунтов панели. Голосовать:

POST/chat-panels/cp_8/poll/votes
curl https://api.skystream.su/app/v1/chat-panels/cp_8/poll/votes \  -X POST \  -H "Authorization: Bearer $API_KEY" \  -H "Content-Type: application/json" \  -d '{    "choice_id": "c1a7"  }'
bash, zshКлюч — в переменной API_KEY

Голосуют аккаунты, которые в этом опросе ещё не голосовали, — повтор запроса лишних голосов не даст. count ограничивает число аккаунтов, points — потратить баллы канала на дополнительные голоса (бесплатный голос у аккаунта один на опрос). Раздать голоса по нескольким вариантам — split вместо choice_id:

POST/chat-panels/cp_8/poll/votes
curl https://api.skystream.su/app/v1/chat-panels/cp_8/poll/votes \  -X POST \  -H "Authorization: Bearer $API_KEY" \  -H "Content-Type: application/json" \  -d '{    "split": [      {        "choice_id": "c1a7",        "count": 2      },      {        "choice_id": "c2b4",        "count": 1      }    ],    "spread_seconds": 60  }'
bash, zshКлюч — в переменной API_KEY

Предсказание

GET /chat-panels/{id}/prediction — предсказание канала и ставки панели. Ставить:

POST/chat-panels/cp_8/prediction/bets
curl https://api.skystream.su/app/v1/chat-panels/cp_8/prediction/bets \  -X POST \  -H "Authorization: Bearer $API_KEY" \  -H "Content-Type: application/json" \  -d '{    "outcome_id": "o-blue",    "points": 1000  }'
bash, zshКлюч — в переменной API_KEY

Ставка — points с каждого аккаунта; с points_min — случайная от points_min до points; all_in: true — весь баланс. Аккаунт с меньшим балансом ставит, сколько есть; без баллов — пропускается. Аккаунт, уже стоящий на этом исходе, добавляет к ставке, поэтому повтор запроса удвоит ставки — передавайте Idempotency-Key.

Растяжка во времени

Голоса и ставки можно растянуть: spread_seconds — до 600 секунд, но не дольше, чем осталось до закрытия. Тогда ответ приходит сразу и несёт раздачу в sending, а голоса и ставки уходят в фоне вразбивку. Ход раздачи — в sending ответов GET .../poll и GET .../prediction. Остановить — POST .../poll/votes/cancel и POST .../prediction/bets/cancel: уже отданное остаётся. Ставки по нескольким исходам (split) всегда идут в фоне.

Одновременно по панели идёт одна раздача голосов и одна — ставок; вторая отклоняется с ошибкой 409 sending_in_progress.

Награды

GET /chat-panels/{id}/rewards — награды канала за баллы. Купить с аккаунта:

POST/chat-panels/cp_8/rewards/9f1c2e4a-1b7d-4c55-9a43-2f0e6c1d8b21/redeem
curl https://api.skystream.su/app/v1/chat-panels/cp_8/rewards/9f1c2e4a-1b7d-4c55-9a43-2f0e6c1d8b21/redeem \  -X POST \  -H "Authorization: Bearer $API_KEY" \  -H "Content-Type: application/json" \  -d '{    "account": "fox_runner",    "text": "Daft Punk — One More Time"  }'
bash, zshКлюч — в переменной API_KEY

Если награда требует текст (text_required), без text запрос отклоняется. Баллы аккаунтов — GET /chat-panels/{id}/accounts?include=points.

Ссылка общего доступа

Ссылка даёт открыть панель модератору или помощнику:

GET/chat-panels/cp_8/share-link
curl https://api.skystream.su/app/v1/chat-panels/cp_8/share-link \  -H "Authorization: Bearer $API_KEY"
bash, zshКлюч — в переменной API_KEY

Ссылка — как пароль

Открывший ссылку с входом в панель управляет чат-панелью полностью: пишет от имени аккаунтов, голосует, тратит баллы и может закрыть панель. Передавайте ссылку только тем, кому доверяете. Ссылка работает до конца срока заказа.

Отозвать доступ — заменить ссылку: прежняя перестаёт работать сразу.

POST/chat-panels/cp_8/share-link/rotate
curl https://api.skystream.su/app/v1/chat-panels/cp_8/share-link/rotate \  -X POST \  -H "Authorization: Bearer $API_KEY"
bash, zshКлюч — в переменной API_KEY

Замена ссылки записывается в журнал действий аккаунта. В журнале запросов API токен ссылки скрыт.

Закрыть панель

Досрочно — отменой заказа: POST /orders/cp_8/cancel, см. Заказ услуг со счёта. Деньги за оставшееся время не возвращаются. Продлить — POST /orders/cp_8/extend.

Ошибки

ОшибкаКогда
409 order_not_activeЗаказ завершён, отменён или срок вышел
409 chat_panel_startingПанель ещё поднимается на сервере — повторите через минуту
503 chat_panel_unavailableСервер перезапускается и восстанавливает панели — повторите через минуту
409 channel_offlineTwitch: канал не в эфире, аккаунты отключены до эфира. Запросы с логином аккаунта в это время тоже получают эту ошибку, а не account_not_in_panel
404 account_not_in_panelАккаунта с таким логином в панели уже нет
400 platform_not_supportedВозможности нет у площадки панели
504 outcome_unknownЧат-сервис не ответил вовремя на отправку, голосование, ставку или покупку, а действие могло выполниться. Не повторяйте вслепую: сначала проверьте чат, опрос, предсказание или баланс баллов

Полный список — в разделе Ошибки и на страницах операций в справочнике.

На этой странице