Начало
ВведениеТокен ботаБазовый URLБыстрый старт
Основы
Запросы и ответыОшибкиЛимитыРазметка текста
Апдейты
getUpdatesWebhookТипы апдейтов
Методы
Бот и командыСообщенияМедиа и файлыЧаты и участникиОпросы и реакцииКнопки и inlineМеню и профильФорум-топикиСтикерыПлатежи и StarsEphemeral
Справочник
ОбъектыОтличия от TelegramПримерыFAQ
ShapitoGram · Bot API

Управляйте ботом
по HTTP

Полный Bot API для ShapitoGram. Совместим с Telegram Bot API — те же методы, поля и ответы. Меняете только адрес сервера.

106методов
25 МБфайлы
24 чхранение апдейтов
terminal
curl "https://api.shapitogram.xyz/bot$BOT/getMe"

{
  "ok": true,
  "result": {
    "id": 8123456789,
    "is_bot": true,
    "username": "my_bot"
  }
}
106 методов

50 базовых в ядре сервера + 56 расширенных через botproxy (чаты, права, опросы, топики).

Long polling и webhook

Оба режима получения апдейтов, с той же семантикой offset и secret_token.

Файлы до 25 МБ

Загрузка через multipart/form-data, выдача через /file/bot<token>/….

Stars и подарки

Счета в XTR, возвраты, каталог подарков и отправка подарков от имени бота.


Токен бота #

Бот создаётся внутри мессенджера — через @BotFather, как в Telegram. Токен выдаёт он же.

  1. Откройте чат с @BotFather в клиенте ShapitoGram.
  2. Отправьте /newbot — укажите отображаемое имя, затем username, оканчивающийся на bot.
  3. Отправьте /token и выберите бота — BotFather пришлёт токен.

Формат токена — <id бота>:<секрет>:

8123456789:AAF3kQ9xLm2vT7pR4sN8yB1cD6eF0gH5jK
Токен — это полный доступ к боту. Не публикуйте его в репозиториях. Если утёк — /revoke в BotFather отзывает старый и выдаёт новый; все запущенные копии бота после этого получат 401 ACCESS_TOKEN_INVALID.

Команды BotFather

КомандаЧто делает
/newbotСоздать бота
/mybotsСписок ваших ботов
/tokenПоказать токен
/revokeОтозвать токен и выдать новый
/setnameИмя бота
/setdescriptionОписание (экран «что умеет бот»)
/setabouttextКороткое «о боте»
/setcommandsСписок команд в меню
/deletebotУдалить бота
/setinlineВключить inline-режим
/setinlinegeoЗапрос геолокации в inline
/setjoingroupsМожно ли добавлять в группы
/setprivacyPrivacy mode в группах
/setloginTelegram Login для бота

/setuserpic в BotFather пока помечен как недоступный на этом сервере.

Базовый URL #

ShapitoGram
https://api.shapitogram.xyz
Метод
https://api.shapitogram.xyz/bot<TOKEN>/<method>
Файл
https://api.shapitogram.xyz/file/bot<TOKEN>/<file_path>

<TOKEN> подставляется целиком, вместе с двоеточием: /bot8123456789:AAF3…/sendMessage. Регистр в имени метода не важен — sendMessage и sendmessage равнозначны.

Короткий адрес api.shapitogram.xyz — основной, его и указывайте в коде. Тот же API по-прежнему отвечает и по старому адресу https://shapitogram.xyz/bot<TOKEN>/<method>: оба хоста ведут на один и тот же сервер, разницы в поведении нет.

Быстрый старт #

curl

export BOT="8123456789:AAF3kQ9xLm2vT7pR4sN8yB1cD6eF0gH5jK"
export API="https://api.shapitogram.xyz"

# кто я
curl "$API/bot$BOT/getMe"

# отправить сообщение
curl -X POST "$API/bot$BOT/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{"chat_id": 123456789, "text": "Привет из Bot API"}'

Python — requests

import requests

BASE = "https://api.shapitogram.xyz"
TOKEN = "8123456789:AAF3kQ9xLm2vT7pR4sN8yB1cD6eF0gH5jK"

def call(method, **params):
    r = requests.post(f"{BASE}/bot{TOKEN}/{method}", json=params, timeout=30)
    data = r.json()
    if not data.get("ok"):
        raise RuntimeError(f'{data["error_code"]}: {data["description"]}')
    return data["result"]

print(call("getMe"))
call("sendMessage", chat_id=123456789, text="Привет из Python")

aiogram 3

from aiogram import Bot
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer

session = AiohttpSession(
    api=TelegramAPIServer.from_base("https://api.shapitogram.xyz")
)
bot = Bot(token="8123456789:AAF3…", session=session)

python-telegram-bot

from telegram.ext import ApplicationBuilder

app = (
    ApplicationBuilder()
    .token("8123456789:AAF3…")
    .base_url("https://api.shapitogram.xyz/bot")
    .build()
)

Node.js

const BASE = "https://api.shapitogram.xyz";
const TOKEN = "8123456789:AAF3kQ9xLm2vT7pR4sN8yB1cD6eF0gH5jK";

async function call(method, params = {}) {
  const res = await fetch(`${BASE}/bot${TOKEN}/${method}`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(params),
  });
  const data = await res.json();
  if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
  return data.result;
}

console.log(await call("getMe"));
await call("sendMessage", { chat_id: 123456789, text: "Привет из Node" });

Запросы и ответы #

Параметры можно передавать четырьмя способами — все поддерживаются:

СпособКак
Query stringGET /bot<t>/sendMessage?chat_id=1&text=hi
JSONPOST с Content-Type: application/json
FormPOST с application/x-www-form-urlencoded
MultipartPOST с multipart/form-data — нужен для загрузки файлов

Успешный ответ всегда обёрнут в ok:

{
  "ok": true,
  "result": {
    "message_id": 42,
    "date": 1793025464,
    "chat": { "id": 123456789, "type": "private", "first_name": "Иван" },
    "text": "Привет из Bot API"
  }
}

Ошибка — тоже JSON, с HTTP-кодом из error_code:

{
  "ok": false,
  "error_code": 401,
  "description": "ACCESS_TOKEN_INVALID"
}

Ошибки #

КодdescriptionКогда
401ACCESS_TOKEN_INVALIDТокен неверный, отозван или бот удалён
404METHOD_NOT_FOUNDТакого метода нет (или путь не разобран)
400CHAT_ID_INVALIDchat_id не число или равен 0
400MESSAGE_EMPTYПустой text там, где он обязателен
400MESSAGE_TOO_LONGТекст длиннее лимита
400ENTITY_INVALIDБитая разметка или entities
400BUTTON_TYPE_INVALIDВ ephemeral нельзя reply-клавиатуру
400SECRET_TOKEN_INVALIDsecret_token не по формату
400CERTIFICATE_PINNING_UNSUPPORTEDПередан certificate
400IP_ADDRESS_UNSUPPORTEDПередан ip_address
409CONFLICTПараллельный getUpdates или активный webhook
501METHOD_NOT_FOUNDМетод есть в списке, но не поддержан (напр. answerShippingQuery)

Лимиты #

Размер загрузки
25 МБ на файл, +1 МБ на остальное тело запроса
Текст сообщения
как в Telegram — 4096 символов
getUpdates
limit ≤ 100, timeout ≤ 50 с, offset ≥ −10000
Один поллинг
на бота одновременно — только один getUpdates, иначе 409
Webhook
max_connections 1…100, по умолчанию 40
Хранение апдейтов
24 часа, затем вытесняются

Разметка текста #

Параметр parse_mode принимает три значения:

ЗначениеСинтаксис
HTML<b>, <i>, <u>, <s>, <code>, <pre>, <a href>, <tg-spoiler>, <blockquote>
Markdown*жирный*, _курсив_, `код`, [текст](url)
MarkdownV2то же, но с обязательным экранированием спецсимволов

Альтернатива — передать готовые entities (массив объектов MessageEntity) и не указывать parse_mode. Для подписей к медиа поля называются caption, parse_mode, caption_entities.


getUpdates #

Long polling. Сервер держит соединение до timeout секунд и возвращает массив апдейтов.

ПараметрТипОписание
offsetintID последнего обработанного апдейта + 1. Подтверждает всё, что меньше
limitint1…100, по умолчанию 100
timeoutintСекунды ожидания, ≤ 50. 0 — сразу вернуть
allowed_updatesstring[]Какие типы апдейтов получать
curl "$API/bot$BOT/getUpdates?offset=0&limit=100&timeout=30"
Пока у бота установлен webhook, getUpdates вернёт 409 CONFLICT. Сначала deleteWebhook.

Webhook #

Сервер сам присылает апдейты POST-запросом на ваш HTTPS-адрес.

ПараметрТипОписание
urlstringHTTPS-адрес. Пустая строка — снять webhook
secret_tokenstring[A-Za-z0-9_-], 1…256 символов
max_connectionsint1…100, по умолчанию 40
allowed_updatesstring[]Фильтр типов
drop_pending_updatesboolВыбросить накопленную очередь
curl -X POST "$API/bot$BOT/setWebhook" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/hook",
    "secret_token": "my-super-secret",
    "max_connections": 40,
    "allowed_updates": ["message", "callback_query"]
  }'

Если задан secret_token, каждый запрос несёт заголовок X-Telegram-Bot-Api-Secret-Token — сравнивайте его с ожидаемым значением.

certificate и ip_address не поддерживаются: сервер отвечает CERTIFICATE_PINNING_UNSUPPORTED / IP_ADDRESS_UNSUPPORTED. Используйте обычный валидный сертификат.

Типы апдейтов #

В allowed_updates можно перечислять:

message · edited_message · channel_post · edited_channel_post · callback_query · inline_query · chosen_inline_result · pre_checkout_query · shipping_query · poll · poll_answer · my_chat_member · chat_member · chat_join_request · message_reaction · business_connection · business_message


Бот и команды #

МетодОписаниеПараметры
getMecoreИнформация о боте: id, имя, username, флаги—
setMyCommandscoreУстановить список командcommands, scope, language_code
getMyCommandscoreПолучить список командscope, language_code
deleteMyCommandscoreОчистить командыscope, language_code
setMyNameextСменить имя ботаname
getMyNameextТекущее имя—
setMyDescriptionextОписание ботаdescription
getMyDescriptionextТекущее описание—
setMyShortDescriptionextКороткое «о боте»short_description
getMyShortDescriptionextТекущее короткое описание—
logOutextЗавершить сессию бота на сервере—
closeextЗакрыть инстанс бота—

Сообщения #

МетодОписаниеПараметры
sendMessagecoreОтправить текстchat_id, text, parse_mode, entities, reply_markup, reply_to_message_id, disable_web_page_preview, disable_notification
sendRichMessagecoreRich-сообщение (блоки: текст, медиа, списки)chat_id, rich_message, reply_markup, reply_to_message_id, protect_content, message_effect_id
editMessageTextcoreИзменить текст отправленногоchat_id, message_id, text, parse_mode, entities, reply_markup
editMessageCaptionextИзменить подпись к медиаchat_id, message_id, caption, parse_mode, reply_markup
editMessageMediaextЗаменить медиа в сообщенииchat_id, message_id, media, reply_markup
editMessageReplyMarkupextЗаменить клавиатуруchat_id, message_id, reply_markup
deleteMessagecoreУдалить одно сообщениеchat_id, message_id
deleteMessagesextУдалить пачкойchat_id, message_ids
forwardMessageextПереслать сообщениеchat_id, from_chat_id, message_id
forwardMessagesextПереслать несколькоchat_id, from_chat_id, message_ids
copyMessageextКопия без пометки «переслано»chat_id, from_chat_id, message_id
copyMessagesextКопировать пачкойchat_id, from_chat_id, message_ids
sendChatActionext«печатает», «загружает фото» и т.п.chat_id, action

Пример: сообщение с inline-кнопками

curl -X POST "$API/bot$BOT/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": 123456789,
    "text": "Выберите действие",
    "parse_mode": "HTML",
    "reply_markup": {
      "inline_keyboard": [
        [
          {"text": "Открыть сайт", "url": "https://shapitogram.xyz"},
          {"text": "Поздороваться", "callback_data": "hello"}
        ]
      ]
    }
  }'

Медиа и файлы #

МетодОписаниеПараметры
sendPhotocoreФотоchat_id, photo, caption, parse_mode, caption_entities, reply_markup, reply_to_message_id
sendVideocoreВидеоchat_id, video, caption, …
sendAnimationcoreGIF / анимацияchat_id, animation, caption, …
sendAudiocoreАудиофайлchat_id, audio, caption, …
sendDocumentcoreДокументchat_id, document, caption, …
sendStickercoreСтикерchat_id, sticker, reply_markup
sendVoicecoreГолосовоеchat_id, voice, caption, …
sendVideoNotecoreКружокchat_id, video_note
sendLivePhotocoreLive Photochat_id, live_photo, photo
sendMediaGroupextАльбом (2–10 элементов)chat_id, media[]
sendContactcoreКонтактchat_id, phone_number, first_name, last_name, vcard
sendLocationcoreГеолокацияchat_id, latitude, longitude, horizontal_accuracy, live_period
sendVenuecoreМесто на картеchat_id, latitude, longitude, title, address
getFilecoreМетаданные файла и file_pathfile_id

В поле медиа можно передать одно из трёх:

  • file_id — уже загруженный ранее файл;
  • публичный https://-URL — сервер скачает сам;
  • файл в multipart/form-data — поле называется так же, как метод (photo, video, …).
curl -X POST "$API/bot$BOT/sendPhoto" \
  -F "chat_id=123456789" \
  -F "photo=@/path/to/picture.jpg" \
  -F "caption=Подпись"

Скачать файл:

curl "$API/file/bot$BOT/<file_path>" -o file.jpg

Чаты и участники #

Все методы этого раздела — расширенные (ext).

МетодОписаниеПараметры
getChatИнформация о чатеchat_id
getChatMemberУчастник и его статусchat_id, user_id
getChatAdministratorsСписок админовchat_id
getChatMemberCountЧисло участниковchat_id
banChatMemberЗабанитьchat_id, user_id, until_date
unbanChatMemberРазбанитьchat_id, user_id
restrictChatMemberОграничить праваchat_id, user_id, permissions
setChatPermissionsПрава по умолчанию для всехchat_id, permissions
promoteChatMemberПовысить до админаchat_id, user_id, can_*
setChatAdministratorCustomTitleСвой титул админаchat_id, user_id, custom_title
pinChatMessageЗакрепитьchat_id, message_id
unpinChatMessageОткрепитьchat_id, message_id
unpinAllChatMessagesОткрепить всёchat_id
leaveChatВыйти из чатаchat_id
setChatTitleПереименовать чатchat_id, title
setChatDescriptionОписание чатаchat_id, description
setChatPhotoАватар чатаchat_id, photo
deleteChatPhotoУбрать аватарchat_id
exportChatInviteLinkПостоянная ссылка-приглашениеchat_id
createChatInviteLinkНовая ссылкаchat_id, name, expire_date, member_limit
revokeChatInviteLinkОтозвать ссылкуchat_id, invite_link
approveChatJoinRequestОдобрить заявкуchat_id, user_id
declineChatJoinRequestОтклонить заявкуchat_id, user_id
banChatSenderChatЗабанить канал от имени чатаchat_id, sender_chat_id
unbanChatSenderChatРазбанить каналchat_id, sender_chat_id

Опросы и реакции #

МетодОписаниеПараметры
sendPollextОпрос или викторинаchat_id, question, options, type, is_anonymous, allows_multiple_answers, correct_option_id, explanation, open_period
stopPollextОстановить опросchat_id, message_id
sendDiceextКубик / дартс / слотыchat_id, emoji
setMessageReactionextПоставить реакциюchat_id, message_id, reaction[], is_big
getUserProfilePhotosextАватары пользователяuser_id, offset, limit

Кнопки и inline #

МетодОписаниеПараметры
answerCallbackQuerycoreОтвет на нажатие кнопки (снимает «часики»)callback_query_id, text, show_alert, url, cache_time
answerWebAppQuerycoreРезультат из Mini Appweb_app_query_id, result
savePreparedInlineMessagecoreПодготовить сообщение для отправки из inlineuser_id, result, allow_*_chats
answerInlineQueryextОтвет на inline-запрос (@bot запрос)inline_query_id, results[], cache_time

Типы клавиатур

ОбъектГде работаетПоля
InlineKeyboardMarkupВ любом сообщенииinline_keyboard[][] — кнопки с callback_data, url, web_app
ReplyKeyboardMarkupТолько в приватном чатеkeyboard[][], resize_keyboard, one_time_keyboard, is_persistent
ReplyKeyboardRemoveУбрать reply-клавиатуруremove_keyboard: true
ForceReplyЗаставить ответитьforce_reply: true, input_field_placeholder
МетодОписаниеПараметры
setChatMenuButtoncoreКнопка меню (команды / Mini App)chat_id, menu_button
getChatMenuButtoncoreТекущая кнопка менюchat_id
setUserEmojiStatuscoreEmoji-статус пользователя (нужно разрешение)user_id, emoji_status_custom_emoji_id, emoji_status_expiration_date

Форум-топики #

Все — расширенные (ext).

МетодОписаниеПараметры
createForumTopicСоздать топикchat_id, name, icon_color, icon_custom_emoji_id
editForumTopicПереименовать / сменить иконкуchat_id, message_thread_id, name
closeForumTopicЗакрытьchat_id, message_thread_id
reopenForumTopicОткрыть зановоchat_id, message_thread_id
deleteForumTopicУдалитьchat_id, message_thread_id

Стикеры #

МетодОписаниеПараметры
getStickerSetextНабор стикеров и его составname
getCustomEmojiStickersextКастомные emoji по IDcustom_emoji_ids[]

Платежи и Stars #

МетодОписаниеПараметры
sendInvoicecoreСчёт на оплату (валюта XTR)chat_id, title, description, payload, currency, prices[]
answerPreCheckoutQuerycoreПодтвердить или отклонить оплатуpre_checkout_query_id, ok, error_message
answerShippingQuerycoreНе поддерживается — 501—
refundStarPaymentcoreВернуть Starsuser_id, telegram_payment_charge_id
getAvailableGiftscoreКаталог подарков—
sendGiftcoreПодарить подарокgift_id, user_id, star_count, text, pay_for_upgrade
giftPremiumSubscriptioncoreПодарить Premiumuser_id, month_count, star_count, text

Как проходит оплата

  1. Бот вызывает sendInvoice с currency: "XTR" и массивом prices.
  2. Пользователь жмёт «Оплатить». Сервер присылает боту pre_checkout_query.
  3. Бот отвечает answerPreCheckoutQuery с ok: true (или false + error_message).
  4. После списания приходит message с successful_payment — там telegram_payment_charge_id.
  5. Возврат — refundStarPayment по этому же charge_id.

Ephemeral-сообщения #

Отдельный механизм этого сервера: сообщение видит только один получатель и только пока открыт экран. Используется для подсказок и «временных» ответов на кнопки.

МетодОписаниеПараметры
editEphemeralMessageTextcoreИзменить текстephemeral_message_id, text, parse_mode
editEphemeralMessageMediacoreЗаменить медиаephemeral_message_id, media
editEphemeralMessageCaptioncoreИзменить подписьephemeral_message_id, caption
editEphemeralMessageReplyMarkupcoreЗаменить клавиатуруephemeral_message_id, reply_markup
deleteEphemeralMessagecoreУдалитьephemeral_message_id

Отправка ephemeral-сообщения — это обычный sendMessage с receiver_user_id (или callback_query_id) вместо обычной доставки в чат. В таком сообщении допустима только inline-клавиатура.


Объекты #

Поля совпадают с Telegram Bot API. Ниже — то, что встречается чаще всего.

User

{
  "id": 123456789,
  "is_bot": false,
  "first_name": "Иван",
  "last_name": "",
  "username": "username",
  "language_code": "ru"
}

Chat

{ "id": 123456789, "type": "private", "first_name": "Иван", "username": "username" }
{ "id": -1001234567890, "type": "channel", "title": "ShapitoGram", "username": "shapitogram" }
{ "id": -1001234567890, "type": "supergroup", "title": "Чат" }

Message

{
  "message_id": 42,
  "date": 1793025464,
  "chat": { "id": 123456789, "type": "private" },
  "from": { "id": 8123456789, "is_bot": true, "first_name": "Мой бот" },
  "text": "Привет",
  "reply_to_message": { "message_id": 41, "chat": { "id": 123456789 } }
}

Update

{
  "update_id": 100500,
  "message": { ... }
}

В объекте приходит ровно одно поле-«полезная нагрузка»: message, edited_message, callback_query, inline_query, pre_checkout_query, poll и т.д.

CallbackQuery

{
  "id": "4382901234",
  "from": { "id": 123456789, "is_bot": false, "first_name": "Иван" },
  "message": { "message_id": 42, "chat": { "id": 123456789 } },
  "chat_instance": "1234567890",
  "data": "hello"
}

LabeledPrice

{ "label": "Подписка на месяц", "amount": 100 }

amount — в минимальных единицах. Для XTR это просто количество звёзд.

BotCommand

{ "command": "start", "description": "Запустить бота" }

Отличия от Telegram Bot API #

API намеренно совместим, но это не копия — вот что важно знать.

ЧтоКак здесь
ДоменСвой, а не api.telegram.org. Библиотекам нужно явно указать базовый URL
ТокеныВыдаёт локальный @BotFather; токены Telegram не работают
ПлатежиТолько XTR (Stars). Провайдеры вроде Stripe не подключены, provider_token не нужен
ДоставкаТолько Telegram-платежи Stars, без shipping — answerShippingQuery возвращает 501
Pinning сертификатаНе поддержан: certificate и ip_address в setWebhook дают 400
Расширенные методы56 методов (чаты, права, опросы, топики, реакции) обслуживает отдельный сервис botproxy поверх MTProto
EphemeralДополнительный механизм, которого нет в Telegram
Ограничение поллингаОдин getUpdates на бота одновременно — иначе 409
Хранение апдейтов24 часа (как в Telegram)
Совместимость библиотек. aiogram, python-telegram-bot, grammY, telegraf работают — нужно только подменить базовый URL. Если библиотека строит ссылки на файлы от api.telegram.org, укажите ей file-базу явно: /file/bot.

Примеры #

Эхо-бот на aiogram 3

import asyncio
from aiogram import Bot, Dispatcher, F
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer
from aiogram.types import Message

TOKEN = "8123456789:AAF3kQ9xLm2vT7pR4sN8yB1cD6eF0gH5jK"
BASE = "https://api.shapitogram.xyz"

session = AiohttpSession(api=TelegramAPIServer.from_base(BASE))
bot = Bot(token=TOKEN, session=session)
dp = Dispatcher()

@dp.message(F.text)
async def echo(message: Message):
    await message.answer(f"Ты написал: {message.text}")

async def main():
    await dp.start_polling(bot)

asyncio.run(main())

Кнопки и callback

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery

@dp.message(F.text == "/menu")
async def menu(message: Message):
    kb = InlineKeyboardMarkup(inline_keyboard=[[
        InlineKeyboardButton(text="Погладить", callback_data="pat"),
        InlineKeyboardButton(text="Сайт", url="https://shapitogram.xyz"),
    ]])
    await message.answer("Что делаем?", reply_markup=kb)

@dp.callback_query(F.data == "pat")
async def pat(call: CallbackQuery):
    await call.answer("Мур!", show_alert=True)
    await call.message.edit_text("Погладил 🐈")

Webhook на FastAPI

from fastapi import FastAPI, Request, Header, HTTPException
import httpx

BASE = "https://api.shapitogram.xyz"
TOKEN = "8123456789:AAF3…"
SECRET = "my-super-secret"

app = FastAPI()

@app.post("/hook")
async def hook(request: Request,
               x_telegram_bot_api_secret_token: str = Header(default="")):
    if x_telegram_bot_api_secret_token != SECRET:
        raise HTTPException(403)
    update = await request.json()
    msg = update.get("message")
    if msg and msg.get("text"):
        await httpx.AsyncClient().post(
            f"{BASE}/bot{TOKEN}/sendMessage",
            json={"chat_id": msg["chat"]["id"], "text": msg["text"]},
        )
    return {"ok": True}

Установка webhook

curl -X POST "$API/bot$BOT/setWebhook" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hook","secret_token":"my-super-secret"}'

# проверить
curl "$API/bot$BOT/getWebhookInfo"

# снять и вернуться к getUpdates
curl -X POST "$API/bot$BOT/deleteWebhook"

FAQ #

Бот отвечает 401 ACCESS_TOKEN_INVALID

Токен скопирован не целиком, либо был /revoke. Проверьте, что в строке есть двоеточие и секрет после него, и что между /bot и токеном нет пробелов.

getUpdates возвращает 409 CONFLICT

Либо уже установлен webhook (deleteWebhook), либо запущено два процесса с одним токеном. Второй вариант — самая частая причина: старый инстанс бота не остановлен.

Метод есть в списке, но отвечает 404

Расширенные методы (ext) обслуживает botproxy. Если он лежит, эти методы недоступны, а базовые продолжают работать. Проверьте, что сервис запущен.

Метод из botproxy «задумывается» на первом вызове

botproxy логинится в сеть под ботом через MTProto и держит сессию. Первый вызов после старта может занять несколько секунд — дальше сессия переиспользуется.

Файл не скачивается по /file/bot…/

file_path берётся из ответа getFile и живёт ограниченное время. Если ссылка «протухла», вызовите getFile снова.

Можно ли использовать токен Telegram-бота?

Нет. Это отдельная сеть со своей базой ботов. Нужен бот, созданный в @BotFather этой сети.


ShapitoGram Bot API · 106 методов · документ обновлён 26.10.2026