Справочник: кросспостинг
Здесь все эндпоинты /site/$SITE/crosspost… с параметрами, ответами и отказами: каждая новая страница сайта после публикации сама уходит постом в ваш Telegram-канал; в консоли это «Настройки → Кросспостинг».
Во всех примерах API — https://onpress.pro/api/v2, SITE — id сайта (SITE_ID), OP_TOKEN — токен op_XXXX. Все эндпоинты страницы пишутся от /site/$SITE и доступны администратору сайта. Как получить токен и в какой форме приходят отказы — на странице «Доступ и токен».
Как подключить канал
Добавьте бота @onpress_tg_bot администратором канала с правом публикации сообщений, укажите канал через PUT /crosspost/telegram с channel и включите отправку тем же эндпоинтом с enabled: true. Платформа сразу проверяет, видит ли бот канал и может ли в нём публиковать; результат приходит в telegram.check.
Как выглядит пост
Пост собирается из самой страницы, без ИИ, одним сообщением. Сверху картинка: превью страницы, а если в начале статьи есть ещё картинки — альбом до четырёх. Ниже жирный заголовок и первые абзацы тела до первого подзаголовка, не больше трёх, с сохранённым жирным, курсивом, зачёркнутым и кодом. Последнее предложение (у длинного — его хвост) становится ссылкой на страницу; кнопок под постом нет. С картинкой текст идёт подписью и укладывается в 1000 знаков, без картинки — в 1600. Текст режется по границе абзаца, внутри абзаца — по границе предложения, слово посередине не рвётся. Страница из одних блоков без абзацев получает текстом своё SEO-описание.
Когда пост уходит
Пост уходит один раз — после первой публикации страницы, примерно через минуту, когда страница уже открывается по адресу. Правки опубликованной страницы второго поста не дают, отложенная страница уходит, когда выходит по расписанию. Не уходят: страницы, опубликованные до включения кросспостинга; страницы вне выбранных разделов; главная и служебные страницы (политика, контакты, 404 и подобные); заметки, перенесённые из Telegram-канала, — иначе пост вернулся бы в канал-источник; закрытые от индексации и под паролем; все страницы закрытого сайта; страницы с датой публикации старше трёх дней — так перенос архива не заваливает канал. Сверх 5 постов в час и 30 в сутки страницы пропускаются. Пропущенные из-за закрытия от индексации, пароля, закрытого сайта, даты и лимита видны в журнале, их можно отправить вручную.
Ошибка Telegram публикацию не ломает: страница выходит на сайте, а ошибка видна в журнале и в проверке канала. Если бота убрали из канала или лишили прав, отправка останавливается до новой успешной проверки.
GET /crosspost
Отдаёт канал, результат проверки, включена ли отправка, разделы, верхние разделы сайта для выбора и лимиты. Например:
curl -s "$API/site/$SITE/crosspost" -H "Authorization: Bearer $OP_TOKEN"
{
"success": true,
"site_id": "x9HTLHECq",
"telegram": {
"bot": "@onpress_tg_bot",
"channel": "@channel",
"chat": { "id": "-1001234567890", "title": "Мой канал", "username": "channel", "url": "https://t.me/channel" },
"enabled": true,
"active": true,
"sections": ["/news/"],
"check": { "ok": true, "code": "ok", "message": "", "checked_at": "2026-10-09T07:44:33Z" },
"enabled_at": "2026-10-09T07:45:35Z"
},
"section_options": [
{ "path": "/news/", "title": "Новости", "pages": 18 }
],
"limits": { "per_hour": 5, "per_day": 30, "max_age_days": 3 }
}
| Поле | Описание |
|---|---|
telegram.channel | канал, как его передали |
telegram.chat | канал по данным Telegram: id, title, username, url; у закрытого канала username и url пустые |
telegram.enabled | включена ли отправка |
telegram.active | посты действительно уходят: отправка включена и последняя проверка канала успешна |
telegram.sections | выбранные разделы; [] — все страницы |
telegram.check | последняя проверка канала, коды — в таблице проверки; null — канал не проверялся |
section_options | опубликованные страницы первого уровня, у которых есть опубликованные дочерние, по числу дочерних |
limits | постов в час, в сутки и предельный возраст страницы в днях |
PUT /crosspost/telegram
Подключает канал, включает или выключает отправку и выбирает разделы. Все поля необязательны, меняется только переданное; новый канал проверяется сразу. Включить можно только канал, который прошёл проверку, и при включении всё уже опубликованное помечается и в канал не уходит. Ошибка Telegram запрос не роняет: канал сохраняется, check.ok — false, check.code — причина. Ответ — как у GET /crosspost. Например, подключить канал и отправлять в него только новости:
curl -s -X PUT "$API/site/$SITE/crosspost/telegram" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"channel": "@channel", "enabled": true, "sections": ["/news/"]}'
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
channel | string | — | @имя, ссылка https://t.me/имя или числовой id закрытого канала (-100…) |
enabled | bool | false | true — новые страницы уходят в канал |
sections | array | [] | пути разделов, до 20: news, /news/ и полный адрес приводятся к /news/; на многоязычном сайте /news/ подходит и к /news/…, и к /en/news/…; корень / разделом не считается; [] — все страницы |
| Код | Статус | Когда | Что делать |
|---|---|---|---|
channel_required | 400 | канал не передан и ещё не подключён | передайте channel |
invite_link | 400 | ссылка-приглашение вида t.me/+… не называет канал | передайте @имя или числовой id |
invalid_channel | 400 | channel не похож на канал | исправьте поле |
invalid_sections | 400 | sections не массив путей или их больше 20 | исправьте поле |
invalid_enabled | 400 | enabled не true и не false | исправьте поле |
unknown_field | 400 | в теле лишнее поле | оставьте channel, enabled, sections |
channel_not_ready | 409 | включение канала, который не прошёл проверку; результат в check | исправьте права бота и проверьте канал |
Коды проверки канала
check.code | Что значит |
|---|---|
ok | бот может публиковать |
channel_not_found | канал не найден или бот в нём не состоит |
bot_not_member | бот не добавлен в канал |
bot_kicked | бота удалили из канала |
bot_not_admin | бот не администратор канала |
no_post_right | у бота нет права публиковать сообщения |
not_a_channel | это группа или чат, а не канал |
telegram_unreachable, rate_limited, telegram_error | Telegram не ответил, ограничил отправку или вернул другую ошибку |
POST /crosspost/telegram/check
Повторяет проверку канала и сохраняет результат; тело не читается. Нужна, когда бота добавили или вернули ему права после ошибки: успешная проверка снова запускает отправку. Ответ — как у GET /crosspost. Например:
curl -s -X POST "$API/site/$SITE/crosspost/telegram/check" -H "Authorization: Bearer $OP_TOKEN"
| Код | Статус | Когда | Что делать |
|---|---|---|---|
not_connected | 404 | канал не подключён | подключите через PUT /crosspost/telegram |
POST /crosspost/telegram/test
Отправляет в канал страницу в том же виде, в каком она ушла бы сама. Страница отправленной не помечается, правила отбора и лимиты не применяются, запись появляется в журнале с kind: "test". Например, тестовый пост страницы 7148:
curl -s -X POST "$API/site/$SITE/crosspost/telegram/test" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"page": 7148}'
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
page | int или string | последняя опубликованная | id или адрес страницы |
{ "success": true, "site_id": "x9HTLHECq", "id": 135, "page_id": 7148, "status": "sent", "message_id": 175, "message_url": "https://t.me/channel/175", "photo": true, "images": 3 }
images — сколько картинок ушло: 0 — пост текстом, 1 — с картинкой, больше — альбом. Ошибка Telegram приходит в том же ответе: status: "failed", code и error.
| Код | Статус | Когда | Что делать |
|---|---|---|---|
not_connected | 404 | канал не подключён | подключите канал |
no_pages | 404 | на сайте нет опубликованных страниц | передайте page |
channel_not_ready | 409 | канал не прошёл проверку | проверьте канал |
page_not_published | 409 | страница не опубликована | опубликуйте её или возьмите другую |
DELETE /crosspost/telegram
Снимает канал и останавливает отправку; журнал остаётся. Ответ — как у GET /crosspost. Например:
curl -s -X DELETE "$API/site/$SITE/crosspost/telegram" -H "Authorization: Bearer $OP_TOKEN"
GET /crosspost/log
Отдаёт журнал отправок, новые сверху: отправленные, упавшие и пропущенные записи. Страницы, которые в канал не идут по устройству — опубликованы до включения, вне разделов, служебные, из Telegram, — в журнал не попадают. Например, последние 30 записей:
curl -s "$API/site/$SITE/crosspost/log?limit=30" -H "Authorization: Bearer $OP_TOKEN"
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
limit | int | 30 | от 1 до 100 |
before | int | — | следующая порция: значение next из прошлого ответа |
{
"success": true,
"site_id": "x9HTLHECq",
"items": [
{ "id": 141, "page_id": 7152, "kind": "auto", "status": "sent", "reason": null, "title": "Новая статья", "url": "https://example.com/news/new-article/", "message_id": 180, "message_url": "https://t.me/channel/180", "error": null, "attempts": 1, "created_at": "2026-10-09T08:04:17Z", "updated_at": "2026-10-09T08:04:19Z" }
],
"next": null
}
| Поле | Описание |
|---|---|
kind | auto — после публикации, test — тестовый пост, manual — отправлен вручную |
status | pending, sent, failed, skipped |
reason | у skipped — причина: noindex, password, site_closed, old_date, limit; у failed — код ошибки Telegram |
error | у failed — текст ошибки Telegram |
message_url | ссылка на пост; у закрытого канала ведёт по номеру канала и открывается только его участникам |
next | id для следующей порции; null — дальше пусто |
POST /crosspost/log/{id}/send
Отправляет сейчас страницу из записи журнала со статусом failed или skipped, без правил отбора и лимита; тело не читается. Ответ — как у тестового поста. Например, запись 141:
curl -s -X POST "$API/site/$SITE/crosspost/log/141/send" -H "Authorization: Bearer $OP_TOKEN"
| Код | Статус | Когда | Что делать |
|---|---|---|---|
invalid_id | 400 | {id} не положительное целое | возьмите id из журнала |
log_row_not_found | 404 | такой записи нет | проверьте id |
not_connected | 404 | канал не подключён | подключите канал |
not_resendable | 409 | запись уже отправлена или это тестовый пост | для теста отправьте новый тестовый пост |
page_not_published | 409 | страница больше не опубликована | — |
in_progress | 409 | запись отправляется прямо сейчас | дождитесь результата в журнале |
channel_not_ready | 409 | канал не прошёл проверку | проверьте канал |