{"openapi":"3.1.0","info":{"title":"KELVIN TG API","version":"1","description":"Кабинет KELVIN TG из своей программы: то же, что делает человек в кабинете. Ключ создаётся в кабинете, раздел «API». Не больше 120 запросов в минуту на ключ. Принятый запрос значит «в очереди телефона»: отправляют телефоны, в своём темпе и в пределах лимитов аккаунтов. Состояния. Рассылка: pending — черновик, running — идёт, paused, cancelled, completed, completed_with_issues. Сообщение и ответ лиду: pending — в очереди телефона; claimed, authorized — телефон отправляет; sent — отправлено; failed — не отправлено (причина в reason); unknown, needs_review — итог неясен, заново не отправлять; cancelled. Телефон: ready, unhealthy, offline. Аккаунт работает, если enabled, нет deletedAt и blockedReason, а его телефон ready."},"servers":[{"url":"https://app.kelvintg.ru/api/v1"}],"security":[{"key":[]}],"components":{"securitySchemes":{"key":{"type":"http","scheme":"bearer","description":"Ключ из раздела «API» кабинета: Authorization: Bearer kelvin_…"}},"schemas":{"Refusal":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Причина для программы, например read_only_key"},"message":{"type":"string","description":"Что случилось и что сделать, по-русски"},"retryAfter":{"type":"integer","description":"Через сколько секунд повторить (только при rate_limited)"},"details":{"type":"object","description":"Подробности отказа, если сервер их знает: поле, аккаунт, место в тексте"}}}}}},"responses":{"Refusal":{"description":"Отказ: код для программы и фраза для человека","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refusal"}}}}}},"paths":{"/me":{"get":{"operationId":"getMe","summary":"Проверить ключ","description":"Отвечает, к какому кабинету относится ключ, что ему разрешено и до какого числа открыт доступ. С этого запроса удобно начать: если он ответил, ключ вставлен правильно. Право ключа: только чтение.","tags":["Проверка ключа"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts":{"get":{"operationId":"getAccounts","summary":"Список аккаунтов","description":"Отдаёт все аккаунты Telegram в кабинете: лимиты, сколько отправлено сегодня, идёт ли прогрев и почему аккаунт сейчас не пишет, если не пишет. Удалённые аккаунты тоже в списке, у них заполнено deletedAt. Счётчики идут с начала суток по Москве. Право ключа: только чтение.","tags":["Аккаунты и телефоны"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"post":{"operationId":"postAccounts","summary":"Добавить аккаунт","description":"Добавляет аккаунт Telegram к телефону в кабинете. Войти в этот аккаунт в Telegram на телефоне нужно руками, запрос этого не делает. На одном телефоне в одном приложении Telegram не больше трёх аккаунтов. Право ключа: чтение и действия.","tags":["Аккаунты и телефоны"],"x-kelvin-scope":"write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Твой номер этого запроса, 8–64 символа. Повтор с тем же номером ничего не делает второй раз.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,64}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["deviceId","label","phone"],"properties":{"deviceId":{"type":"string","description":"Телефон из списка телефонов."},"label":{"type":"string","description":"Название аккаунта в кабинете, 1–100 знаков."},"phone":{"type":"string","description":"Номер аккаунта: 8–15 цифр, можно с «+», пробелами, скобками и дефисами."},"enabled":{"type":"boolean","description":"Включён ли аккаунт. По умолчанию да."},"clientId":{"type":"string","description":"Какое приложение Telegram на телефоне: основное или второе. Без поля — основное."},"replaceSettings":{"type":"boolean","description":"Только если возвращаешь удалённый аккаунт с тем же номером: true — взять лимиты из этого запроса, иначе вернутся прежние."},"messageLimit":{"type":"number","description":"Сколько сообщений в сутки отправляет аккаунт, 0–100. По умолчанию 80."},"phoneSearchLimit":{"type":"number","description":"Сколько получателей в сутки искать по номеру телефона, 0–15. По умолчанию 15."},"taskDelayMin":{"type":"number","description":"Пауза между сообщениями, от: 0–86 400 с. По умолчанию 6. Не больше taskDelayMax."},"taskDelayMax":{"type":"number","description":"Пауза между сообщениями, до: 0–86 400 с. По умолчанию 6."},"accountDelayMin":{"type":"number","description":"Пауза при смене аккаунта, от: 0–86 400 с. По умолчанию 0. Не больше accountDelayMax."},"accountDelayMax":{"type":"number","description":"Пауза при смене аккаунта, до: 0–86 400 с. По умолчанию 0."},"searchDelayMin":{"type":"number","description":"Пауза перед поиском по номеру, от: 0–86 400 с. По умолчанию 0. Не больше searchDelayMax."},"searchDelayMax":{"type":"number","description":"Пауза перед поиском по номеру, до: 0–86 400 с. По умолчанию 0."}}},"example":{"deviceId":"ID_ТЕЛЕФОНА","label":"Аккаунт 2","phone":"+70000000002"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Телефон отключён от кабинета. Подключи его заново и повтори."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/devices":{"get":{"operationId":"getDevices","summary":"Список телефонов","description":"Отдаёт телефоны кабинета: на связи ли телефон, чем занят, версии Android, Telegram и KELVIN TG. Телефон считается не на связи, если молчит дольше 45 секунд. Отключённые телефоны в списке есть, удалённых нет. Право ключа: только чтение.","tags":["Аккаунты и телефоны"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns":{"get":{"operationId":"getCampaigns","summary":"Список рассылок","description":"Отдаёт все рассылки кабинета, новые сверху, и отдельно те, что лежат в корзине. Получателей в этом списке нет: они приходят в запросе одной рассылки. Право ключа: только чтение.","tags":["Рассылки"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"post":{"operationId":"postCampaigns","summary":"Создать рассылку или одно сообщение","description":"Создаёт рассылку-черновик: список получателей, текст и аккаунты. Отправка не начинается, пока ты не вызовешь «Запустить рассылку». Отдельного запроса «написать одному человеку» нет: это рассылка с одним получателем, как в примере, и затем запуск. Право ключа: чтение и действия.","tags":["Рассылки"],"x-kelvin-scope":"write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Твой номер этого запроса, 8–64 символа. Повтор с тем же номером ничего не делает второй раз.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,64}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","template","recipientsText","accountIds"],"properties":{"name":{"type":"string","description":"Название рассылки, до 200 знаков."},"template":{"type":"string","description":"Текст сообщения, до 20 000 знаков со всеми вариантами. Варианты пишутся как {Здравствуйте|Добрый день}, поля из таблицы как [[город|запасной текст]], обращение по имени как [[имя]]. Каждый итоговый вариант не длиннее 4096 знаков. Можно не передавать, только если отправляешь пост без текста."},"recipientsText":{"type":"string","description":"Получатели, по одному в строке: username (5–32 знака, с @ или без, можно ссылкой t.me/имя) или телефон (8–15 цифр). Не больше 20 000. Повторы убираются сами, любая нераспознанная строка даёт отказ."},"accountIds":{"type":"array","items":{"type":"string"},"description":"С каких аккаунтов отправлять: хотя бы один аккаунт этого кабинета. Получатели раздаются по аккаунтам по кругу."},"schedule":{"type":"object","description":"Когда можно отправлять: {timeZone: \"Europe/Moscow\" или \"UTC\", startLocal: \"ГГГГ-ММ-ДДTЧЧ:ММ\" (не раньше текущей минуты) или null, weekdays: дни недели 0–6, где 0 — воскресенье, intervals: от 1 до 4 отрезков {start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}}. Если конец раньше начала, отрезок переходит через полночь. Без поля рассылка идёт без расписания."},"pacing":{"type":"object","description":"Темп. Любое поле можно не передавать, тогда берётся значение из скобок: batchMin и batchMax — сообщений подряд, 1–20 (2 и 5); waitMinSeconds и waitMaxSeconds — пауза между сообщениями, 10–1800 с (55 и 85); readMinSeconds и readMaxSeconds — перерыв между сериями, 30–600 с (90 и 240); readInBreaks — читать каналы в перерывах (да); spreadEnabled — растягивать отправку по времени (да); spreadMinutes — 15–480 (60). Минимум не больше максимума."},"recipientFields":{"type":"object","description":"Поля из таблицы по получателям: {\"username:synthetic_lead\": {\"город\": \"Казань\"}}. Ключ — \"username:имя\" или \"phone:+7…\". Имя поля — строчные буквы, цифры и «_», до 32 знаков; значение до 500 знаков; до 30 полей на получателя."},"nameExclusions":{"type":"array","items":{"type":"string"},"description":"Кому писать без обращения по имени: ключи вида \"username:имя\" или \"phone:+7…\", не больше 20 000."},"secondTouch":{"type":"object","description":"Второе касание: {enabled: да/нет (обязательно), days: 2, 3 или 5 (по умолчанию 3), audience: \"read\" — тем, кто прочитал, или \"all\" — всем (по умолчанию \"read\"), template: текст до 20 000 знаков, не больше 50 вариантов}. Текст должен отличаться от первого сообщения. С постом не сочетается."},"content":{"type":"object","description":"Что отправлять. Не передавать или {kind: \"text\"} — текст из template. {kind: \"post\", post: {…}, textPlace: \"before\" | \"after\" | null} — пост: post как в «Проверить пост», textPlace добавляет текст отдельным сообщением до или после поста. Пересылка поста из канала работает только для получателей с username."},"baseLabel":{"type":"string","description":"«База»: откуда эти получатели, до 60 знаков. Нужна, чтобы сравнивать базы в статистике."},"autoReply":{"type":"object","description":"Автоответ на первое сообщение лида: {enabled: да/нет (обязательно), kind: \"text\" или \"post\", text: текст до 4096 знаков, варианты {а|б} можно, поля [[…]] нельзя, post: пост как в «Проверить пост», textPlace: \"before\", \"after\" или null, pauseFrom и pauseTo: пауза перед ответом, 5–900 с (30 и 165)}."},"stopWarmup":{"type":"boolean","description":"Передай true, если выбранный аккаунт сейчас на прогреве и ты согласен прогрев выключить. Без этого придёт отказ."}}},"example":{"name":"Проверка","template":"Здравствуйте! Это проверка.","recipientsText":"@synthetic_lead","accountIds":["ID_АККАУНТА"]}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"В тексте есть поле [[…]], для которого у части получателей нет значения. Добавь запасной текст: [[город|вашем городе]]."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Один из аккаунтов на прогреве. Останови прогрев или повтори запрос с stopWarmup: true (с новым номером запроса)."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/{campaignId}":{"get":{"operationId":"getCampaignsId","summary":"Рассылка и её получатели","description":"Отдаёт рассылку целиком: настройки, статус и что стало с каждым получателем. Здесь же лежит номер версии revision, он нужен, чтобы менять рассылку. Рассылку из корзины этот запрос не находит. Право ключа: только чтение.","tags":["Рассылки"],"x-kelvin-scope":"read","parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"patch":{"operationId":"patchCampaignsId","summary":"Изменить черновик рассылки","description":"Заменяет черновик целиком: передавай все поля, как при создании, а не только изменённые. Работает, пока рассылку ни разу не запускали. После запуска меняются только настройки, для этого есть отдельный запрос. Право ключа: чтение и действия.","tags":["Рассылки"],"x-kelvin-scope":"write","parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["expectedRevision","name","template","recipientsText","accountIds"],"properties":{"expectedRevision":{"type":"number","description":"Номер версии revision, который ты видел в рассылке. Если рассылку успели изменить, придёт отказ, и ничего не затрётся."},"name":{"type":"string","description":"Название рассылки, до 200 знаков."},"template":{"type":"string","description":"Текст сообщения, до 20 000 знаков со всеми вариантами. Варианты пишутся как {Здравствуйте|Добрый день}, поля из таблицы как [[город|запасной текст]], обращение по имени как [[имя]]. Каждый итоговый вариант не длиннее 4096 знаков. Можно не передавать, только если отправляешь пост без текста."},"recipientsText":{"type":"string","description":"Получатели, по одному в строке: username (5–32 знака, с @ или без, можно ссылкой t.me/имя) или телефон (8–15 цифр). Не больше 20 000. Повторы убираются сами, любая нераспознанная строка даёт отказ."},"accountIds":{"type":"array","items":{"type":"string"},"description":"С каких аккаунтов отправлять: хотя бы один аккаунт этого кабинета. Получатели раздаются по аккаунтам по кругу."},"schedule":{"type":"object","description":"Когда можно отправлять: {timeZone: \"Europe/Moscow\" или \"UTC\", startLocal: \"ГГГГ-ММ-ДДTЧЧ:ММ\" (не раньше текущей минуты) или null, weekdays: дни недели 0–6, где 0 — воскресенье, intervals: от 1 до 4 отрезков {start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}}. Если конец раньше начала, отрезок переходит через полночь. Если не передать, расписание снимется."},"pacing":{"type":"object","description":"Темп. Любое поле можно не передавать, тогда берётся значение из скобок: batchMin и batchMax — сообщений подряд, 1–20 (2 и 5); waitMinSeconds и waitMaxSeconds — пауза между сообщениями, 10–1800 с (55 и 85); readMinSeconds и readMaxSeconds — перерыв между сериями, 30–600 с (90 и 240); readInBreaks — читать каналы в перерывах (да); spreadEnabled — растягивать отправку по времени (да); spreadMinutes — 15–480 (60). Минимум не больше максимума. Если не передать весь объект, темп вернётся к значениям из скобок."},"recipientFields":{"type":"object","description":"Поля из таблицы по получателям: {\"username:synthetic_lead\": {\"город\": \"Казань\"}}. Ключ — \"username:имя\" или \"phone:+7…\". Имя поля — строчные буквы, цифры и «_», до 32 знаков; значение до 500 знаков; до 30 полей на получателя."},"nameExclusions":{"type":"array","items":{"type":"string"},"description":"Кому писать без обращения по имени: ключи вида \"username:имя\" или \"phone:+7…\", не больше 20 000. Если не передать, останется прежний список."},"secondTouch":{"type":"object","description":"Второе касание: {enabled: да/нет (обязательно), days: 2, 3 или 5 (по умолчанию 3), audience: \"read\" — тем, кто прочитал, или \"all\" — всем (по умолчанию \"read\"), template: текст до 20 000 знаков, не больше 50 вариантов}. Текст должен отличаться от первого сообщения. С постом не сочетается. Если не передать, второе касание выключится."},"content":{"type":"object","description":"Что отправлять. Не передавать или {kind: \"text\"} — текст из template. {kind: \"post\", post: {…}, textPlace: \"before\" | \"after\" | null} — пост: post как в «Проверить пост», textPlace добавляет текст отдельным сообщением до или после поста. Пересылка поста из канала работает только для получателей с username."},"baseLabel":{"type":"string","description":"«База»: откуда эти получатели, до 60 знаков. Нужна, чтобы сравнивать базы в статистике. Если не передать, останется прежняя."},"autoReply":{"type":"object","description":"Автоответ на первое сообщение лида: {enabled: да/нет (обязательно), kind: \"text\" или \"post\", text: текст до 4096 знаков, варианты {а|б} можно, поля [[…]] нельзя, post: пост как в «Проверить пост», textPlace: \"before\", \"after\" или null, pauseFrom и pauseTo: пауза перед ответом, 5–900 с (30 и 165)}. Если не передать, автоответ выключится."}}},"example":{"expectedRevision":1,"name":"Проверка, вторая версия","template":"Здравствуйте! Это проверка.","recipientsText":"@synthetic_lead","accountIds":["ID_АККАУНТА"]}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"Все получатели уже в списке «Не писать». Отправлять некому."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Рассылку изменили после того, как ты её прочитал. Запроси её заново и повтори с новым revision."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/{campaignId}/export":{"get":{"operationId":"getCampaignsIdExport","summary":"Скачать получателей таблицей","description":"Отдаёт получателей рассылки файлом CSV с их статусами, как кнопка выгрузки в кабинете. Ответ — файл, а не JSON: разделитель «;», открывается в Excel. Право ключа: только чтение.","tags":["Рассылки"],"x-kelvin-scope":"read","parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"Кого выгрузить: all — всех (по умолчанию), waiting — кто ещё в очереди, review — с ошибками, unknown — где отправка ещё проверяется, либо точный статус: pending, claimed, authorized, sent, failed, needs_review, cancelled.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Поиск по получателю (без @) и по значениям полей из таблицы.","schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaign-playbooks":{"get":{"operationId":"getCampaignPlaybooks","summary":"Список наборов","description":"Отдаёт сохранённые наборы настроек рассылки: текст, темп, расписание и аккаунты. Получателей в наборах нет. Право ключа: только чтение.","tags":["Наборы настроек"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"post":{"operationId":"postCampaignPlaybooks","summary":"Сохранить набор","description":"Сохраняет настройки рассылки, чтобы не вводить их каждый раз. Получатели в набор не входят. Право ключа: чтение и действия.","tags":["Наборы настроек"],"x-kelvin-scope":"write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Твой номер этого запроса, 8–64 символа. Повтор с тем же номером ничего не делает второй раз.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,64}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","template","accountIds"],"properties":{"name":{"type":"string","description":"Название набора, до 200 знаков."},"template":{"type":"string","description":"Текст сообщения с вариантами {а|б} и полями [[поле|запасной текст]]. Проверяется так же, как в рассылке."},"accountIds":{"type":"array","items":{"type":"string"},"description":"Аккаунты, с которых обычно идёт такая рассылка: хотя бы один аккаунт кабинета."},"schedule":{"type":"object","description":"Когда можно отправлять: {timeZone: \"Europe/Moscow\" или \"UTC\", startLocal: \"ГГГГ-ММ-ДДTЧЧ:ММ\" (не раньше текущей минуты) или null, weekdays: дни недели 0–6, где 0 — воскресенье, intervals: от 1 до 4 отрезков {start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}}. Если конец раньше начала, отрезок переходит через полночь."},"pacing":{"type":"object","description":"Темп. Любое поле можно не передавать, тогда берётся значение из скобок: batchMin и batchMax — сообщений подряд, 1–20 (2 и 5); waitMinSeconds и waitMaxSeconds — пауза между сообщениями, 10–1800 с (55 и 85); readMinSeconds и readMaxSeconds — перерыв между сериями, 30–600 с (90 и 240); readInBreaks — читать каналы в перерывах (да); spreadEnabled — растягивать отправку по времени (да); spreadMinutes — 15–480 (60). Минимум не больше максимума."},"requiredChecks":{"type":"array","items":{"type":"string"},"description":"Что проверить перед запуском: до 20 пунктов, каждый до 200 знаков."}}},"example":{"name":"Первое касание","template":"{Здравствуйте|Добрый день}! Это проверка.","accountIds":["ID_АККАУНТА"],"requiredChecks":["Проверить список получателей"]}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaign-playbooks/{playbookId}":{"get":{"operationId":"getCampaignPlaybooksId","summary":"Один набор","description":"Отдаёт набор целиком вместе с номером версии version. Этот номер пригодится, чтобы изменить набор и не затереть чужую правку. Право ключа: только чтение.","tags":["Наборы настроек"],"x-kelvin-scope":"read","parameters":[{"name":"playbookId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"put":{"operationId":"putCampaignPlaybooksId","summary":"Изменить набор","description":"Заменяет набор целиком: передавай все поля, а не только изменённые. Расписание, темп и список проверок без своих полей сбросятся. Уже созданные рассылки не меняются. Право ключа: чтение и действия.","tags":["Наборы настроек"],"x-kelvin-scope":"write","parameters":[{"name":"playbookId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","template","accountIds"],"properties":{"name":{"type":"string","description":"Название набора, до 200 знаков."},"template":{"type":"string","description":"Текст сообщения с вариантами {а|б} и полями [[поле|запасной текст]]. Проверяется так же, как в рассылке."},"accountIds":{"type":"array","items":{"type":"string"},"description":"Аккаунты, с которых обычно идёт такая рассылка: хотя бы один аккаунт кабинета."},"schedule":{"type":"object","description":"Когда можно отправлять: {timeZone: \"Europe/Moscow\" или \"UTC\", startLocal: \"ГГГГ-ММ-ДДTЧЧ:ММ\" (не раньше текущей минуты) или null, weekdays: дни недели 0–6, где 0 — воскресенье, intervals: от 1 до 4 отрезков {start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}}. Если конец раньше начала, отрезок переходит через полночь."},"pacing":{"type":"object","description":"Темп. Любое поле можно не передавать, тогда берётся значение из скобок: batchMin и batchMax — сообщений подряд, 1–20 (2 и 5); waitMinSeconds и waitMaxSeconds — пауза между сообщениями, 10–1800 с (55 и 85); readMinSeconds и readMaxSeconds — перерыв между сериями, 30–600 с (90 и 240); readInBreaks — читать каналы в перерывах (да); spreadEnabled — растягивать отправку по времени (да); spreadMinutes — 15–480 (60). Минимум не больше максимума."},"requiredChecks":{"type":"array","items":{"type":"string"},"description":"Что проверить перед запуском: до 20 пунктов, каждый до 200 знаков."},"version":{"type":"number","description":"Номер версии, который ты видел. Если набор успели изменить, придёт отказ. Без поля набор перезапишется без проверки."}}},"example":{"name":"Первое касание, вечер","template":"{Здравствуйте|Добрый день}! Это проверка.","accountIds":["ID_АККАУНТА"],"requiredChecks":["Проверить список получателей"]}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Набор изменили после того, как ты его прочитал. Запроси его заново и повтори с новым version."},"429":{"$ref":"#/components/responses/Refusal"}}},"delete":{"operationId":"deleteCampaignPlaybooksId","summary":"Удалить набор","description":"Удаляет набор насовсем, вернуть его нельзя. Рассылки, созданные по этому набору, остаются как были. Право ключа: чтение и действия.","tags":["Наборы настроек"],"x-kelvin-scope":"write","parameters":[{"name":"playbookId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaign-playbooks/{playbookId}/apply-preview":{"get":{"operationId":"getCampaignPlaybooksIdApplyPreview","summary":"Что даст набор","description":"Показывает, что подставится в новую рассылку из набора, и каких аккаунтов из него уже нет в кабинете. Рассылку не создаёт: для этого возьми данные набора и вызови «Создать рассылку». Право ключа: только чтение.","tags":["Наборы настроек"],"x-kelvin-scope":"read","parameters":[{"name":"playbookId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/blocklist":{"get":{"operationId":"getBlocklist","summary":"Список «Не писать»","description":"Отдаёт всех, кому кабинет не пишет: username и телефоны, причину и дату добавления. Username и телефон одного человека между собой не связываются: добавляй оба, если знаешь оба. Право ключа: только чтение.","tags":["«Не писать»"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"post":{"operationId":"postBlocklist","summary":"Добавить в «Не писать»","description":"Добавляет людей в список и сразу отменяет им сообщения, которые ещё в очереди, во всех рассылках кабинета. Сообщение, которое телефон уже начал отправлять, может уйти. В ответе видно, кто добавлен, кто уже был в списке и какие строки не распознаны. Право ключа: чтение и действия.","tags":["«Не писать»"],"x-kelvin-scope":"write","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Кого добавить, по одному в строке: username или телефон, как в списке получателей."},"reason":{"type":"string","description":"Причина, до 200 знаков. Видна только в кабинете."}}},"example":{"text":"@synthetic_blocked","reason":"Попросил не писать"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"delete":{"operationId":"deleteBlocklist","summary":"Убрать из «Не писать»","description":"Убирает одного человека из списка. Сообщения, отменённые из-за списка раньше, не возвращаются: человек попадёт только в новые рассылки. Поля передаются в теле запроса. Право ключа: чтение и действия.","tags":["«Не писать»"],"x-kelvin-scope":"write","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","value"],"properties":{"kind":{"type":"string","description":"\"username\" или \"phone\". Должен совпасть с тем, что написано в value."},"value":{"type":"string","description":"Один получатель: @имя, ссылка t.me/имя или телефон."}}},"example":{"kind":"username","value":"@synthetic_blocked"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/work/stop-all":{"get":{"operationId":"getWorkStopAll","summary":"Нажато ли «Остановить всё»","description":"Отвечает, остановлена ли работа кабинета, кто и когда её остановил и как каждый телефон это подтвердил. Пока работа остановлена, телефоны новых заданий не получают. Право ключа: только чтение.","tags":["«Остановить всё»"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"post":{"operationId":"postWorkStopAll","summary":"Остановить всё","description":"Сразу останавливает всю работу кабинета: рассылки, прогрев и активность в группах. Сообщение, которое телефон уже начал отправлять, он закончит. Программа может только остановить: возобновить работу может только человек в кабинете, кнопкой «Возобновить работу». Право ключа: чтение и действия.","tags":["«Остановить всё»"],"x-kelvin-scope":"write","parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/stats":{"get":{"operationId":"getStats","summary":"Статистика","description":"Отдаёт то же, что страница «Статистика»: сколько отправлено, прочитано и сколько ответили, по аккаунтам, рассылкам и базам. Сообщения в состоянии «вероятно отправлено» считаются отправленными. Пустое значение вместо числа значит, что данных нет. Право ключа: только чтение.","tags":["Статистика и журнал"],"x-kelvin-scope":"read","parameters":[{"name":"days","in":"query","required":false,"description":"Период: \"7\", \"30\" (по умолчанию) или \"all\" — за всё время. Сутки считаются по Москве.","schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/stats/accounts":{"get":{"operationId":"getStatsAccounts","summary":"Отправки по аккаунтам","description":"Отдаёт по каждому аккаунту, сколько сообщений рассылок он отправил всего, за 7 дней и сегодня, сколько лидов ответили и когда была последняя отправка. Право ключа: только чтение.","tags":["Статистика и журнал"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/today/week":{"get":{"operationId":"getTodayWeek","summary":"Итог за 7 дней","description":"Отдаёт по дням за последнюю неделю: сколько отправлено, сколько сообщений ждут проверки, сколько аккаунтов получили ограничение и сколько раз работу останавливали. Сутки считаются по Москве. Право ключа: только чтение.","tags":["Статистика и журнал"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/day-plan":{"get":{"operationId":"getDayPlan","summary":"Сколько ещё уйдёт сегодня","description":"Оценивает по каждому телефону, сколько сообщений он ещё может отправить до конца суток по Москве, и называет причины, если отправка стоит. Это оценка «от и до» по лимитам и времени, а не обещание. Право ключа: только чтение.","tags":["Статистика и журнал"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/events":{"get":{"operationId":"getEvents","summary":"Журнал событий","description":"Отдаёт журнал кабинета, свежее сверху: кто что сделал и когда. У действий, сделанных программой, указано название ключа. Тексты записей частично на английском, поэтому в программе опирайся на поле type. Право ключа: только чтение.","tags":["Статистика и журнал"],"x-kelvin-scope":"read","parameters":[{"name":"from","in":"query","required":false,"description":"С какого момента, включительно. Дата и время в виде 2026-10-10T09:00:00.000Z.","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"До какого момента, не включая его. В том же виде.","schema":{"type":"string"}},{"name":"accountId","in":"query","required":false,"description":"Только события этого аккаунта.","schema":{"type":"string"}},{"name":"deviceId","in":"query","required":false,"description":"Только события этого телефона и его аккаунтов.","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Типы событий через запятую, до 50. Например campaign_created,work_stopped.","schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Значение nextBefore из прошлого ответа: придёт следующая, более старая страница.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Сколько записей отдать, 1–200. По умолчанию 50.","schema":{"type":"number"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/dialog-list":{"get":{"operationId":"getDialogList","summary":"Что телефоны прочитали в Telegram","description":"Отдаёт сводку по каждому аккаунту: сколько чатов телефон увидел в папке «Лиды», сколько из них ответили, прочитали и не прочитали. В строках есть названия чатов и начало сообщений, если они не нужны, запроси без строк. Право ключа: только чтение.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"read","parameters":[{"name":"rows","in":"query","required":false,"description":"\"0\" — только сводка, без строк по чатам. Без параметра строки приходят, до 3000 на аккаунт.","schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts/{accountId}/timeline":{"get":{"operationId":"getAccountsIdTimeline","summary":"Лента аккаунта","description":"Отдаёт всё, что происходило с аккаунтом за последние дни, свежее сверху: отправки, прогрев, проверки, остановки. В ленте только статусы, без текстов и номеров. Не больше 3000 записей. Право ключа: только чтение.","tags":["Аккаунты и телефоны"],"x-kelvin-scope":"read","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}},{"name":"days","in":"query","required":false,"description":"За сколько дней, 1–30. По умолчанию 7.","schema":{"type":"number"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup/today":{"get":{"operationId":"getWarmupToday","summary":"Прогрев: план и факт на сегодня","description":"Отдаёт по каждому телефону и аккаунту, сколько заходов в Telegram запланировано на сегодня и сколько уже сделано. Сутки считаются по Москве. Право ключа: только чтение.","tags":["Прогрев и группы"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup/sources":{"get":{"operationId":"getWarmupSources","summary":"Прогрев: каналы и подписки","description":"Отдаёт, сколько каналов есть в каталоге прогрева и чем закончились сегодняшние подписки: подписались, уже были подписаны, канал недоступен. Право ключа: только чтение.","tags":["Прогрев и группы"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup-runs":{"get":{"operationId":"getWarmupRuns","summary":"Список программ прогрева","description":"Отдаёт программы прогрева кабинета, до 100, новые сверху: аккаунты, срок, часы работы и сколько заходов сделано. Право ключа: только чтение.","tags":["Прогрев и группы"],"x-kelvin-scope":"read","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}},"post":{"operationId":"postWarmupRuns","summary":"Создать программу прогрева","description":"Создаёт черновик программы: какие аккаунты, сколько дней и в какие часы телефон читает каналы и подписывается на них. Прогрев не начинается, пока ты не вызовешь «Запустить программу прогрева». Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Твой номер этого запроса, 8–64 символа. Повтор с тем же номером ничего не делает второй раз.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,64}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["window","accounts"],"properties":{"window":{"type":"object","description":"Часы, в которые телефон заходит в Telegram, каждый день: {timeZone: \"Europe/Moscow\" или \"UTC\", start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}. Если конец раньше начала, окно переходит через полночь. Окно должно быть длиннее одного захода."},"accounts":{"type":"array","items":{"type":"object"},"description":"От 1 до 50 аккаунтов без повторов, каждый как {accountId, profile, durationDays, settings}. profile: \"read_only\" — только чтение, 1 заход в день; \"work_reading\" — чтение, 3–7 заходов; \"safe\" — 1–3 захода и 2–3 подписки; \"standard\" — 3–6 заходов и 5 подписок; \"intensive\" — 5–8 заходов и 7–8 подписок; \"pilot_one\" — одна пробная подписка. durationDays: 1–365. settings (только для read_only и work_reading): {visits: [от, до] в пределах 1–12, visitSeconds: [от, до] в пределах 60–600}."},"pilotHandle":{"type":"string","description":"Только для profile \"pilot_one\": username канала из каталога, 5–32 знака. Тогда в программе один аккаунт и один день."},"start":{"type":"boolean","description":"true — сразу проверить, что аккаунты свободны и телефоны умеют прогрев. Запуск всё равно отдельным запросом."}}},"example":{"window":{"timeZone":"Europe/Moscow","start":"10:00","end":"20:00"},"accounts":[{"accountId":"ID_АККАУНТА","profile":"read_only","durationDays":3}]}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"Окно слишком короткое для выбранного режима. Раздвинь часы работы."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup-runs/{runId}/journal":{"get":{"operationId":"getWarmupRunsIdJournal","summary":"Журнал программы прогрева","description":"Отдаёт, что происходило в программе, свежее сверху: заходы, подписки, остановки и их причины. Право ключа: только чтение.","tags":["Прогрев и группы"],"x-kelvin-scope":"read","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}},{"name":"accountId","in":"query","required":false,"description":"Только записи этого аккаунта программы.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Сколько записей отдать, 1–500. По умолчанию 100.","schema":{"type":"number"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/group-activity/journal":{"get":{"operationId":"getGroupActivityJournal","summary":"Журнал активности в группах","description":"Отдаёт отчёты телефона о заходах в группы для одного аккаунта, свежие сверху: что сделал и чем закончилось. Право ключа: только чтение.","tags":["Прогрев и группы"],"x-kelvin-scope":"read","parameters":[{"name":"accountId","in":"query","required":true,"description":"Аккаунт, чей журнал нужен.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Сколько записей отдать, 1–500. По умолчанию 100.","schema":{"type":"number"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/ai/queue":{"get":{"operationId":"getAiQueue","summary":"Чаты, которые ждут человека","description":"Отдаёт чаты, которые ИИ передал человеку, с причиной по-русски, и чаты с готовым черновиком ответа. Нужен ключ с правом на действия: при этом запросе ИИ заодно ставит в очередь следующую часть своего ответа из нескольких сообщений. Право ключа: чтение и действия.","tags":["ИИ-ответы"],"x-kelvin-scope":"write","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/ai/stats":{"get":{"operationId":"getAiStats","summary":"Статистика ИИ-ответов","description":"Отдаёт, сколько ответов ИИ подготовил за период и сколько из них приняты. Пустое значение вместо числа значит «данных пока нет», а не ноль. Текстов переписки в ответе нет. Право ключа: только чтение.","tags":["ИИ-ответы"],"x-kelvin-scope":"read","parameters":[{"name":"days","in":"query","required":false,"description":"За сколько дней считать, 1–30. По умолчанию 7.","schema":{"type":"number"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats/incoming":{"get":{"operationId":"getChatsIncoming","summary":"Новые сообщения лидов","description":"Отдаёт входящие сообщения лидов по всему кабинету по порядку. Запомни after из ответа и передай его в следующий раз: так ты получишь только новое, без пропусков и повторов. Наших сообщений здесь нет. Право ключа: только чтение.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"read","parameters":[{"name":"after","in":"query","required":false,"description":"Значение after из прошлого ответа. По умолчанию 0, то есть с самого начала.","schema":{"type":"number"}},{"name":"limit","in":"query","required":false,"description":"Сколько сообщений отдать, 1–500. По умолчанию 100.","schema":{"type":"number"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats":{"get":{"operationId":"getChats","summary":"Список чатов","description":"Отдаёт чаты с лидами, свежие сверху: имя, последнее сообщение, сколько непрочитанных и ждёт ли чат ответа. Чаты появляются по мере того, как телефоны передают их в кабинет. Право ключа: только чтение.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"read","parameters":[{"name":"offset","in":"query","required":false,"description":"Сколько чатов пропустить, 0–1 000 000. По умолчанию 0.","schema":{"type":"number"}},{"name":"limit","in":"query","required":false,"description":"Сколько чатов отдать, 50–500. По умолчанию 50, меньше 50 не бывает.","schema":{"type":"number"}},{"name":"account","in":"query","required":false,"description":"Чаты одного аккаунта: его номер из списка аккаунтов. \"none\" — чаты, у которых аккаунт ещё не определён.","schema":{"type":"string"}},{"name":"unread","in":"query","required":false,"description":"\"1\" — только чаты, которые ждут ответа. Сильнее, чем filter.","schema":{"type":"string"}},{"name":"filter","in":"query","required":false,"description":"\"replied\" — лид написал хотя бы раз, \"waiting\" — последнее сообщение наше.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Поиск по имени или username, первые 100 знаков.","schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats/{chatId}":{"get":{"operationId":"getChatsId","summary":"Переписка в чате","description":"Отдаёт чат, до 100 последних сообщений и ответы, которые ты поставил в очередь, с их состоянием. В переписке то, что телефон успел передать в кабинет: до ответа лиду телефон в чат не заходит. Право ключа: только чтение.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"read","parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"}},{"name":"before","in":"query","required":false,"description":"Номер самого старого сообщения, которое у тебя уже есть: придут до 100 сообщений старше него.","schema":{"type":"number"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats/reply-requests/{requestNumber}":{"get":{"operationId":"getChatsReplyRequestsId","summary":"Узнать судьбу ответа","description":"Показывает, что стало с ответом, по номеру из «Idempotency-Key», с которым ты его отправлял. Нужен, когда ответ сервера потерялся: сначала спроси здесь, а не отправляй заново. Состояние unknown значит «вероятно отправлено», повторять такой ответ не надо. Право ключа: только чтение.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"read","parameters":[{"name":"requestNumber","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"description":"Ответа с таким номером запроса нет: он не был принят. Можно отправить снова."},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/import/preview":{"post":{"operationId":"postImportPreview","summary":"Проверить список получателей","description":"Разбирает список и показывает, кого KELVIN распознал, какие строки не подошли, сколько повторов и кого уберёт «Не писать». Ничего не сохраняет. Удобно вызвать перед созданием рассылки. Право ключа: только чтение.","tags":["Рассылки"],"x-kelvin-scope":"read","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Получатели, по одному в строке: username или телефон, как в рассылке. Не больше 20 000."}}},"example":{"text":"@synthetic_lead\nsynthetic_lead_two"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/messages/preview":{"post":{"operationId":"postMessagesPreview","summary":"Проверить текст сообщения","description":"Показывает, какие сообщения получатся из текста с вариантами и полями. Если передать получателей, покажет ещё, у кого не хватает значений и как распозналось имя. Ничего не сохраняет. Право ключа: только чтение.","tags":["Рассылки"],"x-kelvin-scope":"read","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["template"],"properties":{"template":{"type":"string","description":"Текст с вариантами {а|б} и полями [[поле|запасной текст]]. Вложенные скобки не поддерживаются."},"recipientsText":{"type":"string","description":"Получатели, как в рассылке. Без них в ответе будут только варианты текста и их число."},"recipientFields":{"type":"object","description":"Поля из таблицы по получателям, как в рассылке."},"nameExclusions":{"type":"array","items":{"type":"string"},"description":"Кому писать без обращения по имени, как в рассылке."},"filter":{"type":"string","description":"Кого показать в таблице имён: \"all\" (по умолчанию), \"recognized\" — имя распознано, \"unrecognized\" — не распознано."},"offset":{"type":"number","description":"С какой строки таблицы имён начать, от 0. По умолчанию 0."},"limit":{"type":"number","description":"Сколько строк таблицы имён отдать, 1–200. По умолчанию 20."}}},"example":{"template":"{Здравствуйте|Добрый день}! Это проверка."}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"В тексте ошибка в фигурных скобках: лишняя, незакрытая, вложенная или с пустым вариантом. В ответе указано место."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/posts/check":{"post":{"operationId":"postPostsCheck","summary":"Проверить пост","description":"Проверяет пост, который ты хочешь разослать вместо текста: код от @PostBot или ссылку на пост публичного канала. Ничего не сохраняет. Для кода проверяется только его вид, для ссылки KELVIN открывает пост на t.me. Право ключа: чтение и действия.","tags":["Рассылки"],"x-kelvin-scope":"write","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["post"],"properties":{"post":{"type":"object","description":"Пост от @PostBot: {via: \"postbot\", codes: [\"код\", …]}, код — 6–64 латинских букв, цифр, «_» и «-». Пост из канала: {via: \"forward\", links: [\"t.me/канал/123\", …]}, только публичные каналы. В обоих случаях не больше 50 постов."}}},"example":{"post":{"via":"postbot","codes":["synthetic0code1"]}}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"Сайт t.me не ответил, пост проверить не удалось. Повтори через минуту."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/rehearsal":{"post":{"operationId":"postCampaignsRehearsal","summary":"Проверить рассылку без создания","description":"Принимает те же поля, что «Создать рассылку», и делает те же проверки, но ничего не сохраняет. В ответе: сколько получателей останется после «Не писать», сколько вариантов текста и до пяти примеров готовых сообщений. Право ключа: только чтение.","tags":["Рассылки"],"x-kelvin-scope":"read","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","template","recipientsText","accountIds"],"properties":{"name":{"type":"string","description":"Название рассылки, до 200 знаков."},"template":{"type":"string","description":"Текст сообщения, до 20 000 знаков со всеми вариантами. Варианты пишутся как {Здравствуйте|Добрый день}, поля из таблицы как [[город|запасной текст]], обращение по имени как [[имя]]. Каждый итоговый вариант не длиннее 4096 знаков. Можно не передавать, только если отправляешь пост без текста."},"recipientsText":{"type":"string","description":"Получатели, по одному в строке: username (5–32 знака, с @ или без, можно ссылкой t.me/имя) или телефон (8–15 цифр). Не больше 20 000. Повторы убираются сами, любая нераспознанная строка даёт отказ."},"accountIds":{"type":"array","items":{"type":"string"},"description":"С каких аккаунтов отправлять: хотя бы один аккаунт этого кабинета. Получатели раздаются по аккаунтам по кругу."},"schedule":{"type":"object","description":"Когда можно отправлять: {timeZone: \"Europe/Moscow\" или \"UTC\", startLocal: \"ГГГГ-ММ-ДДTЧЧ:ММ\" (не раньше текущей минуты) или null, weekdays: дни недели 0–6, где 0 — воскресенье, intervals: от 1 до 4 отрезков {start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}}. Если конец раньше начала, отрезок переходит через полночь. Без поля рассылка идёт без расписания."},"pacing":{"type":"object","description":"Темп. Любое поле можно не передавать, тогда берётся значение из скобок: batchMin и batchMax — сообщений подряд, 1–20 (2 и 5); waitMinSeconds и waitMaxSeconds — пауза между сообщениями, 10–1800 с (55 и 85); readMinSeconds и readMaxSeconds — перерыв между сериями, 30–600 с (90 и 240); readInBreaks — читать каналы в перерывах (да); spreadEnabled — растягивать отправку по времени (да); spreadMinutes — 15–480 (60). Минимум не больше максимума."},"recipientFields":{"type":"object","description":"Поля из таблицы по получателям: {\"username:synthetic_lead\": {\"город\": \"Казань\"}}. Ключ — \"username:имя\" или \"phone:+7…\". Имя поля — строчные буквы, цифры и «_», до 32 знаков; значение до 500 знаков; до 30 полей на получателя."},"nameExclusions":{"type":"array","items":{"type":"string"},"description":"Кому писать без обращения по имени: ключи вида \"username:имя\" или \"phone:+7…\", не больше 20 000."},"secondTouch":{"type":"object","description":"Второе касание: {enabled: да/нет (обязательно), days: 2, 3 или 5 (по умолчанию 3), audience: \"read\" — тем, кто прочитал, или \"all\" — всем (по умолчанию \"read\"), template: текст до 20 000 знаков, не больше 50 вариантов}. Текст должен отличаться от первого сообщения. С постом не сочетается."},"content":{"type":"object","description":"Что отправлять. Не передавать или {kind: \"text\"} — текст из template. {kind: \"post\", post: {…}, textPlace: \"before\" | \"after\" | null} — пост: post как в «Проверить пост», textPlace добавляет текст отдельным сообщением до или после поста. Пересылка поста из канала работает только для получателей с username."},"baseLabel":{"type":"string","description":"«База»: откуда эти получатели, до 60 знаков. Нужна, чтобы сравнивать базы в статистике."},"autoReply":{"type":"object","description":"Автоответ на первое сообщение лида: {enabled: да/нет (обязательно), kind: \"text\" или \"post\", text: текст до 4096 знаков, варианты {а|б} можно, поля [[…]] нельзя, post: пост как в «Проверить пост», textPlace: \"before\", \"after\" или null, pauseFrom и pauseTo: пауза перед ответом, 5–900 с (30 и 165)}."}}},"example":{"name":"Проверка","template":"Здравствуйте! Это проверка.","recipientsText":"@synthetic_lead","accountIds":["ID_АККАУНТА"]}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"В тексте есть поле [[…]], для которого у части получателей нет значения. Добавь запасной текст: [[город|вашем городе]]."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/{campaignId}/second-touch/preview":{"post":{"operationId":"postCampaignsIdSecondTouchPreview","summary":"Посчитать второе касание","description":"Считает, сколько человек получат второе сообщение при таких настройках и когда. Ничего не сохраняет: чтобы включить второе касание, измени настройки рассылки. Право ключа: только чтение.","tags":["Рассылки"],"x-kelvin-scope":"read","parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["expectedRevision"],"properties":{"expectedRevision":{"type":"number","description":"Номер версии revision из рассылки."},"secondTouch":{"type":"object","description":"Второе касание: {enabled: да/нет (обязательно), days: 2, 3 или 5 (по умолчанию 3), audience: \"read\" — тем, кто прочитал, или \"all\" — всем (по умолчанию \"read\"), template: текст до 20 000 знаков, не больше 50 вариантов}. Текст должен отличаться от первого сообщения. С постом не сочетается. Без поля считаются сохранённые настройки."},"accountIds":{"type":"array","items":{"type":"string"},"description":"Если хочешь прикинуть с другим набором аккаунтов. Без поля берутся аккаунты рассылки."},"schedule":{"type":"object","description":"Когда можно отправлять: {timeZone: \"Europe/Moscow\" или \"UTC\", startLocal: \"ГГГГ-ММ-ДДTЧЧ:ММ\" (не раньше текущей минуты) или null, weekdays: дни недели 0–6, где 0 — воскресенье, intervals: от 1 до 4 отрезков {start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}}. Если конец раньше начала, отрезок переходит через полночь. Без поля берётся расписание рассылки."}}},"example":{"expectedRevision":1,"secondTouch":{"enabled":true,"days":3,"audience":"read","template":"Добрый день! Напоминаю о себе."}}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"Текст второго касания совпадает с первым сообщением. Напиши другой."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Рассылку изменили после того, как ты её прочитал. Запроси её заново и повтори с новым revision."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/{campaignId}/settings":{"patch":{"operationId":"patchCampaignsIdSettings","summary":"Изменить настройки рассылки","description":"Меняет название, аккаунты, расписание, темп, второе касание и автоответ. Работает и для запущенной рассылки, текст и получателей не трогает. Расписание и темп передавай каждый раз: без них они сбросятся. Право ключа: чтение и действия.","tags":["Рассылки"],"x-kelvin-scope":"write","parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["expectedRevision","name","accountIds"],"properties":{"expectedRevision":{"type":"number","description":"Номер версии revision из рассылки. Если он устарел, придёт отказ."},"name":{"type":"string","description":"Название рассылки, до 200 знаков."},"accountIds":{"type":"array","items":{"type":"string"},"description":"Аккаунты рассылки, хотя бы один. Добавленный аккаунт начнёт брать получателей из общей очереди, убранный перестанет."},"schedule":{"type":"object","description":"Когда можно отправлять: {timeZone: \"Europe/Moscow\" или \"UTC\", startLocal: \"ГГГГ-ММ-ДДTЧЧ:ММ\" (не раньше текущей минуты) или null, weekdays: дни недели 0–6, где 0 — воскресенье, intervals: от 1 до 4 отрезков {start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}}. Если конец раньше начала, отрезок переходит через полночь. Если не передать, расписание снимется."},"pacing":{"type":"object","description":"Темп. Любое поле можно не передавать, тогда берётся значение из скобок: batchMin и batchMax — сообщений подряд, 1–20 (2 и 5); waitMinSeconds и waitMaxSeconds — пауза между сообщениями, 10–1800 с (55 и 85); readMinSeconds и readMaxSeconds — перерыв между сериями, 30–600 с (90 и 240); readInBreaks — читать каналы в перерывах (да); spreadEnabled — растягивать отправку по времени (да); spreadMinutes — 15–480 (60). Минимум не больше максимума. Если не передать весь объект, темп вернётся к значениям из скобок."},"secondTouch":{"type":"object","description":"Второе касание: {enabled: да/нет (обязательно), days: 2, 3 или 5 (по умолчанию 3), audience: \"read\" — тем, кто прочитал, или \"all\" — всем (по умолчанию \"read\"), template: текст до 20 000 знаков, не больше 50 вариантов}. Текст должен отличаться от первого сообщения. С постом не сочетается. Если не передать, останется как было."},"autoReply":{"type":"object","description":"Автоответ на первое сообщение лида: {enabled: да/нет (обязательно), kind: \"text\" или \"post\", text: текст до 4096 знаков, варианты {а|б} можно, поля [[…]] нельзя, post: пост как в «Проверить пост», textPlace: \"before\", \"after\" или null, pauseFrom и pauseTo: пауза перед ответом, 5–900 с (30 и 165)}. Если не передать, останется как было."},"baseLabel":{"type":"string","description":"«База», до 60 знаков. Если не передать, останется прежняя."},"stopWarmup":{"type":"boolean","description":"Передай true, если добавляешь аккаунт, который сейчас на прогреве, и согласен прогрев выключить."}}},"example":{"expectedRevision":1,"name":"Проверка","accountIds":["ID_АККАУНТА"]}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"Начало расписания в прошлом. Поставь время не раньше текущей минуты."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Рассылку изменили после того, как ты её прочитал. Запроси её заново и повтори с новым revision."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/{campaignId}/start":{"post":{"operationId":"postCampaignsIdStart","summary":"Запустить рассылку","description":"Запускает созданную рассылку или продолжает её после паузы: телефоны начнут отправлять сообщения в своём обычном темпе и в пределах дневных лимитов аккаунтов. Если в кабинете нажато «Остановить всё», запрос примется, но отправка начнётся только после возобновления работы человеком. Право ключа: чтение и действия.","tags":["Рассылки"],"x-kelvin-scope":"write","parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"stopWarmup":{"type":"boolean","description":"Передай true, если аккаунт рассылки сейчас на прогреве и ты согласен прогрев выключить."}}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Один из аккаунтов на прогреве. Останови прогрев или повтори запрос с stopWarmup: true."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/{campaignId}/pause":{"post":{"operationId":"postCampaignsIdPause","summary":"Поставить рассылку на паузу","description":"Останавливает выдачу новых сообщений телефонам. Сообщение, которое телефон уже начал отправлять, он закончит. Продолжить можно запросом «Запустить рассылку». Право ключа: чтение и действия.","tags":["Рассылки"],"x-kelvin-scope":"write","parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Рассылка отменена, ставить её на паузу незачем."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/{campaignId}/cancel":{"post":{"operationId":"postCampaignsIdCancel","summary":"Отменить рассылку","description":"Отменяет рассылку насовсем: все, кто ещё в очереди, сообщение не получат, и запустить её снова нельзя. Сообщение, которое телефон уже начал отправлять, он закончит. Если хочешь продолжить позже, ставь на паузу. Право ключа: чтение и действия.","tags":["Рассылки"],"x-kelvin-scope":"write","parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Рассылка уже отменена."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/campaigns/trash":{"post":{"operationId":"postCampaignsTrash","summary":"Убрать в корзину или вернуть","description":"Переносит рассылки в корзину или возвращает из неё. Идущая рассылка при этом встаёт на паузу. Уже отправленные сообщения остаются в статистике. Право ключа: чтение и действия.","tags":["Рассылки"],"x-kelvin-scope":"write","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ids","action"],"properties":{"ids":{"type":"array","items":{"type":"string"},"description":"Какие рассылки: от 1 до 500 номеров."},"action":{"type":"string","description":"\"delete\" — в корзину, \"restore\" — вернуть из корзины."}}},"example":{"ids":["ID_РАССЫЛКИ"],"action":"delete"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Телефон прямо сейчас отправляет сообщение этой рассылки. Поставь её на паузу, дождись конца отправки и повтори. Ни одна рассылка из запроса не изменилась."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats/{chatId}/reply":{"post":{"operationId":"postChatsIdReply","summary":"Ответить лиду","description":"Ставит ответ в очередь телефона: он отправит его с того аккаунта, который ведёт чат, когда освободится. Если этот чат вёл ИИ, дальше его ведёшь ты. Повтор запроса с тем же номером в заголовке «Idempotency-Key» второе сообщение не создаст. Право ключа: чтение и действия.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"write","parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Твой номер этого запроса, 8–64 символа. Повтор с тем же номером ничего не делает второй раз.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,64}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Текст ответа, от 1 до 4096 знаков."}}},"example":{"text":"Здравствуйте! Это проверка."}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Аккаунт этого чата удалён или не определён. Ответить с него нельзя."},"410":{"description":"Ответы из кабинета сейчас выключены. Напиши в поддержку KELVIN TG."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats/replies/{replyId}/cancel":{"post":{"operationId":"postChatsRepliesIdCancel","summary":"Отменить ответ","description":"Отменяет ответ, пока он ждёт в очереди. Номер ответа — taskId из ответа на «Ответить лиду». Если телефон уже взял ответ в работу, отменить его нельзя. Право ключа: чтение и действия.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"write","parameters":[{"name":"replyId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Телефон уже отправляет этот ответ или закончил. Отменить его нельзя."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats/{chatId}/read":{"post":{"operationId":"postChatsIdRead","summary":"Сверить чат с телефоном","description":"Просит телефон открыть чат и передать в кабинет свежую переписку. Это задание в очереди телефона: результат появится в запросе «Переписка в чате», когда телефон до него дойдёт. Право ключа: чтение и действия.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"write","parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"reason":{"type":"string","description":"\"opened\" — мягкая сверка, не чаще раза в 2 минуты на чат. Без поля сверка запрашивается всегда."}}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Телефон этого чата отключён от кабинета или на нём старая версия KELVIN TG. Подключи или обнови телефон."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats/{chatId}/seen":{"post":{"operationId":"postChatsIdSeen","summary":"Отметить прочитанным в кабинете","description":"Убирает счётчик непрочитанных у чата в кабинете. В Telegram ничего не меняется: лид не увидит, что сообщение прочитано. Право ключа: чтение и действия.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"write","parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["upTo"],"properties":{"upTo":{"type":"string","description":"Дата и время самого свежего сообщения лида, которое ты показал, в виде 2026-10-10T09:00:00.000Z. Всё, что раньше, считается прочитанным."}}},"example":{"upTo":"2026-10-10T09:00:00.000Z"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/chats/{chatId}/review":{"post":{"operationId":"postChatsIdReview","summary":"Снять «ждёт ответа»","description":"Отмечает, что отвечать на этот чат не нужно, и убирает его из тех, что ждут ответа. Новое сообщение лида вернёт отметку. Право ключа: чтение и действия.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"write","parameters":[{"name":"chatId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts/{accountId}":{"patch":{"operationId":"patchAccountsId","summary":"Изменить аккаунт","description":"Меняет название, лимиты и паузы аккаунта или выключает его. Передавай только то, что меняешь. Новые лимиты действуют сразу для сообщений, которые телефон ещё не взял. Право ключа: чтение и действия.","tags":["Аккаунты и телефоны"],"x-kelvin-scope":"write","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"label":{"type":"string","description":"Название аккаунта, 1–100 знаков."},"enabled":{"type":"boolean","description":"false выключает аккаунт: он перестаёт отправлять."},"messageLimit":{"type":"number","description":"Сколько сообщений в сутки отправляет аккаунт, 0–100."},"phoneSearchLimit":{"type":"number","description":"Сколько получателей в сутки искать по номеру телефона, 0–15."},"taskDelayMin":{"type":"number","description":"Пауза между сообщениями, от: 0–86 400 с. Не больше taskDelayMax."},"taskDelayMax":{"type":"number","description":"Пауза между сообщениями, до: 0–86 400 с."},"accountDelayMin":{"type":"number","description":"Пауза при смене аккаунта, от: 0–86 400 с. Не больше accountDelayMax."},"accountDelayMax":{"type":"number","description":"Пауза при смене аккаунта, до: 0–86 400 с."},"searchDelayMin":{"type":"number","description":"Пауза перед поиском по номеру, от: 0–86 400 с. Не больше searchDelayMax."},"searchDelayMax":{"type":"number","description":"Пауза перед поиском по номеру, до: 0–86 400 с."}}},"example":{"messageLimit":40}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Номер аккаунта изменить нельзя. Добавь новый аккаунт с другим номером."},"429":{"$ref":"#/components/responses/Refusal"}}},"delete":{"operationId":"deleteAccountsId","summary":"Удалить аккаунт","description":"Убирает аккаунт из кабинета: его сообщения в очереди отменяются, и это не отменить. Из рассылок он выходит, а общую очередь получателей доделают другие аккаунты. Сам аккаунт в Telegram не трогается, история в статистике остаётся. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Аккаунт прямо сейчас выполняет задание или проверку. Дождись конца и повтори."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts/{accountId}/warmup":{"post":{"operationId":"postAccountsIdWarmup","summary":"Включить или выключить прогрев аккаунта","description":"Включает или выключает простой прогрев одного аккаунта. Пока прогрев идёт, рассылка с этого аккаунта запустится только с подтверждением stopWarmup. Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","description":"\"start\" — включить, \"stop\" — выключить."}}},"example":{"action":"stop"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Аккаунт прямо сейчас отправляет сообщение. Включи прогрев, когда отправка закончится."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts/{accountId}/group-activity":{"patch":{"operationId":"patchAccountsIdGroupActivity","summary":"Настроить активность в группах","description":"Настраивает, как аккаунт ведёт себя в группах и каналах: заходит, листает, ставит реакции, вступает. Передавай только то, что меняешь. Если включить, аккаунт начнёт делать это в Telegram по-настоящему. Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"enabled":{"type":"boolean","description":"Включить активность. Не включится, пока нет ни одной группы и выключен каталог."},"joinAllowed":{"type":"boolean","description":"Можно ли вступать в группы."},"reactionsEnabled":{"type":"boolean","description":"Ставить ли реакции."},"catalogEnabled":{"type":"boolean","description":"Брать ли каналы из общего каталога KELVIN."},"groups":{"type":"array","items":{"type":"string"},"description":"Разрешённые группы: @username или ссылка https://t.me/…, до 50."},"schedule":{"type":"object","description":"Когда можно отправлять: {timeZone: \"Europe/Moscow\" или \"UTC\", startLocal: \"ГГГГ-ММ-ДДTЧЧ:ММ\" (не раньше текущей минуты) или null, weekdays: дни недели 0–6, где 0 — воскресенье, intervals: от 1 до 4 отрезков {start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}}. Если конец раньше начала, отрезок переходит через полночь."},"joinLimit24h":{"type":"number","description":"Вступлений в сутки, 0–50. По умолчанию 3."},"reactionLimit24h":{"type":"number","description":"Реакций в сутки, 0–300. По умолчанию 40."},"scrollMin":{"type":"number","description":"Сколько раз листать за заход, от: 0–100. По умолчанию 6."},"scrollMax":{"type":"number","description":"Сколько раз листать за заход, до: 0–100, не меньше scrollMin. По умолчанию 12."},"sessionMinSeconds":{"type":"number","description":"Длина захода, от: 30–3600 с. По умолчанию 90."},"sessionMaxSeconds":{"type":"number","description":"Длина захода, до: 30–3600 с, не меньше sessionMinSeconds. По умолчанию 180."},"pauseMinSeconds":{"type":"number","description":"Пауза между заходами, от: 0–86 400 с. По умолчанию 600."},"pauseMaxSeconds":{"type":"number","description":"Пауза между заходами, до: 0–86 400 с, не меньше pauseMinSeconds. По умолчанию 1800."},"maxActionsPerSession":{"type":"number","description":"Действий за заход, 1–20. По умолчанию 2."},"reactionEmojis":{"type":"array","items":{"type":"string"},"description":"Какие реакции ставить: до 12 обычных бесплатных реакций Telegram."},"reactionProbability":{"type":"number","description":"Как часто ставить реакцию, от 0 до 1. По умолчанию 0.5."},"catalogPoolSize":{"type":"number","description":"Сколько каналов брать из каталога, 1–200. По умолчанию 40."},"sessionsLimit":{"type":"number","description":"Сколько заходов сделать всего, 0–1000. 0 — без ограничения. Новое значение обнуляет счётчик сделанных."},"channelsPerSession":{"type":"number","description":"Каналов за заход, 1–20. По умолчанию 1."}}},"example":{"joinLimit24h":2,"reactionsEnabled":false}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"Включить нельзя: добавь хотя бы одну группу или включи каталог."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Телефон прямо сейчас выполняет заход по группам. Дождись отчёта и повтори."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts/{accountId}/group-activity/group-state":{"post":{"operationId":"postAccountsIdGroupActivityGroupState","summary":"Отметить, состоит ли аккаунт в группе","description":"Записывает твоё решение по группе из списка аккаунта: состоит он в ней, не состоит или группа недоступна. Нужен, когда телефон сам этого не понял. Заходы в эту группу, которые ждали в очереди, снимаются. Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["group","membership"],"properties":{"group":{"type":"string","description":"Группа из списка этого аккаунта: @username или ссылка https://t.me/…."},"membership":{"type":"string","description":"\"member\" — состоит, \"not_member\" — не состоит, \"unavailable\" — группа недоступна, \"unknown\" — неизвестно."}}},"example":{"group":"@synthetic_group","membership":"member"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"description":"Этой группы нет в списке аккаунта. Сначала добавь её в настройках активности в группах."},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/dialog-list/refresh":{"post":{"operationId":"postDialogListRefresh","summary":"Обновить список чатов","description":"Просит телефоны заново прочитать список чатов в Telegram. Это задание в очереди: телефон выполнит его, когда будет свободен и на связи. В ответе queued — сколько заданий поставлено. Право ключа: чтение и действия.","tags":["Чаты и ответы лидам"],"x-kelvin-scope":"write","parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"accountId":{"type":"string","description":"Обновить только этот аккаунт. Без поля — все включённые аккаунты кабинета."},"rows":{"type":"number","description":"Сколько строк списка прочитать, 1–3000. Без поля KELVIN считает сам по числу отправок аккаунта."}}},"example":{"accountId":"ID_АККАУНТА"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup-runs/{runId}/start":{"post":{"operationId":"postWarmupRunsIdStart","summary":"Запустить программу прогрева","description":"Запускает черновик программы: телефоны начнут заходить в Telegram в заданные часы. Если в кабинете нажато «Остановить всё», заходы начнутся после возобновления работы человеком. Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Программа остановлена или завершена. Остановленную продолжают запросом «Продолжить программу прогрева»."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup-runs/{runId}/resume":{"post":{"operationId":"postWarmupRunsIdResume","summary":"Продолжить программу прогрева","description":"Продолжает остановленную программу или один остановленный аккаунт в ней. Оставшиеся заходы переносятся в новое окно. К кнопке «Возобновить работу» после «Остановить всё» этот запрос отношения не имеет. Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["durationDays"],"properties":{"durationDays":{"type":"number","description":"Сколько дней программа длится всего, 1–365. Не меньше, чем уже запланировано."},"window":{"type":"object","description":"Часы, в которые телефон заходит в Telegram, каждый день: {timeZone: \"Europe/Moscow\" или \"UTC\", start: \"ЧЧ:ММ\", end: \"ЧЧ:ММ\"}. Если конец раньше начала, окно переходит через полночь. Обязательно, если продолжаешь всю остановленную программу."},"accountId":{"type":"string","description":"Продолжить только этот аккаунт. Часы работы тогда остаются прежними."}}},"example":{"durationDays":3,"window":{"timeZone":"Europe/Moscow","start":"10:00","end":"20:00"}}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"description":"Срок меньше, чем дней уже запланировано. Увеличь durationDays."},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Продолжать нечего: все заходы программы уже сделаны."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup-runs/{runId}/stop":{"post":{"operationId":"postWarmupRunsIdStop","summary":"Остановить программу прогрева","description":"Останавливает программу для всех её аккаунтов. Заход, который телефон уже начал, он закончит и отчитается. Продолжить можно запросом «Продолжить программу прогрева». Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup-runs/{runId}/accounts/{accountId}/stop":{"post":{"operationId":"postWarmupRunsIdAccountsIdStop","summary":"Остановить прогрев одного аккаунта","description":"Останавливает прогрев одного аккаунта, остальные в программе продолжают. Когда остановлены все аккаунты, останавливается и программа. Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}},{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/warmup-runs/{runId}":{"delete":{"operationId":"deleteWarmupRunsId","summary":"Удалить черновик прогрева","description":"Удаляет программу, которую ещё не запускали. Вернуть её нельзя. Запущенную программу удалить нельзя, её можно только остановить: она остаётся в истории. Право ключа: чтение и действия.","tags":["Прогрев и группы"],"x-kelvin-scope":"write","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Программу уже запускали. Её можно остановить, но не удалить."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/devices/{deviceId}/revoke":{"post":{"operationId":"postDevicesIdRevoke","summary":"Отключить телефон","description":"Сразу отключает телефон от кабинета, например если он потерян. Сообщения его аккаунтов в очереди отменяются, и это не отменить. Вернуть телефон можно только новым подключением по коду с самого телефона. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirmed"],"properties":{"confirmed":{"type":"boolean","description":"Должно быть true: так ты подтверждаешь отключение."}}},"example":{"confirmed":true}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/devices/{deviceId}/delete":{"post":{"operationId":"postDevicesIdDelete","summary":"Удалить телефон","description":"Отключает телефон, убирает его из списка и удаляет из кабинета все его аккаунты. Их сообщения в очереди отменяются, и это не отменить. История остаётся в журнале, а те же номера можно добавить заново на другом телефоне. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirmed"],"properties":{"confirmed":{"type":"boolean","description":"Должно быть true: так ты подтверждаешь удаление."}}},"example":{"confirmed":true}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Телефон прямо сейчас выполняет задание. Дождись отчёта и повтори."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/tasks/{taskId}/confirm-delivery":{"post":{"operationId":"postTasksIdConfirmDelivery","summary":"Подтвердить, что сообщение ушло","description":"Для сообщений в состоянии «вероятно отправлено»: ты сам посмотрел в Telegram и подтверждаешь, что оно доставлено. Сообщение навсегда записывается как отправленное и попадает в статистику, отменить это нельзя. Повторно KELVIN такое сообщение не отправляет в любом случае. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirmed"],"properties":{"confirmed":{"type":"boolean","description":"Должно быть true."},"manualSend":{"type":"boolean","description":"true — если сообщение остановила пауза рассылки и ты отправил его руками в Telegram."}}},"example":{"confirmed":true}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Телефон этого аккаунта сейчас выполняет задание. Дождись конца и повтори."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/tasks/{taskId}/keep-review":{"post":{"operationId":"postTasksIdKeepReview","summary":"Оставить сообщение на проверке","description":"Записывает в журнал твоё решение: итог отправки этого сообщения пока неясен, разберёшься позже. Состояние сообщения и счётчики не меняются, но запись в журнале остаётся навсегда. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"note":{"type":"string","description":"Заметка для себя, до 200 знаков."}}},"example":{"note":"Проверю позже"}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"У этого сообщения итог уже известен или доставка подтверждена. Оставлять на проверке нечего."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts/{accountId}/health/gate":{"post":{"operationId":"postAccountsIdHealthGate","summary":"Проверка @SpamBot: включить или выключить","description":"Включает или выключает для аккаунта проверку у @SpamBot. Если включить, аккаунт перед следующей серией сообщений спросит @SpamBot и будет отправлять только при ответе «ограничений нет». Если выключить, аккаунт пишет без этой проверки, и ограничение от Telegram ты заметишь позже. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean","description":"true — включить проверку, false — выключить."}}},"example":{"enabled":true}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts/{accountId}/health/clear":{"post":{"operationId":"postAccountsIdHealthClear","summary":"Снять остановку после @SpamBot","description":"Вручную возвращает аккаунт в работу, не спрашивая @SpamBot: отправка с него продолжится. Если ограничение в Telegram на самом деле не снято, сообщения уйдут с ограниченного аккаунта, и вернуть их нельзя. Пока идут 12 часов после ответа @SpamBot об ограничении, запрос откажет. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirmed"],"properties":{"confirmed":{"type":"boolean","description":"Должно быть true."}}},"example":{"confirmed":true}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Снимать нечего: аккаунт не ждёт проверки и не остановлен."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/accounts/{accountId}/health/recheck":{"post":{"operationId":"postAccountsIdHealthRecheck","summary":"Проверить аккаунт у @SpamBot снова","description":"Просит телефон заново спросить @SpamBot. Аккаунт вернётся к отправке, только если придёт ответ «ограничений нет». Проверку делает телефон, когда до неё дойдёт очередь, и отозвать её нельзя. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}},"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"description":"Аккаунт отложен на 12 часов после ограничения от @SpamBot. Повтори после срока из ответа."},"429":{"$ref":"#/components/responses/Refusal"}}}},"/workspace/export":{"get":{"operationId":"getWorkspaceExport","summary":"Скачать данные кабинета","description":"Отдаёт одним файлом рассылки, получателей, аккаунты, телефоны и журнал всего кабинета. Паролей, ключей и текстов переписки в файле нет, но списки получателей есть: файл, который ушёл наружу, обратно не вернуть. Скачивание записывается в журнал. Файл может быть большим. Право ключа: опасные действия.","tags":["Опасные действия"],"x-kelvin-scope":"danger","parameters":[],"responses":{"200":{"description":"Ответ кабинета"},"400":{"$ref":"#/components/responses/Refusal"},"401":{"$ref":"#/components/responses/Refusal"},"403":{"$ref":"#/components/responses/Refusal"},"404":{"$ref":"#/components/responses/Refusal"},"409":{"$ref":"#/components/responses/Refusal"},"429":{"$ref":"#/components/responses/Refusal"}}}}}}