Боты
Справочник Bot API
Все методы Bot API в Min: параметры и примеры ответов.
Базовый URL: https://minchatapp.com/bot<token>/<method>. Все методы принимают GET и POST. Сервер читает только перечисленные параметры.
Основное
getMe — Информация о боте
Возвращает бота как объект User.
Параметры
Без параметров.
Возвращает:
User
curl "https://minchatapp.com/bot$BOT_TOKEN/getMe"
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/getMe`);
const data = await res.json();
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
print(requests.get(f"{API}/getMe", timeout=10).json()['result'])
{
"ok": true,
"result": {
"id": 5,
"is_bot": true,
"first_name": "Weather",
"last_name": "Bot",
"username": "weather_bot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false
}
}
sendChatAction — Действие в чате (заглушка)
Принимается для совместимости и возвращает true; пользователям пока ничего не показывается.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
Чат: id пользователя (> 0) для личного чата или -conversation_id (< 0) для группы/канала, где бот состоит. @username не поддерживается. |
action
обязательный
|
String |
например, typing. |
Возвращает:
True
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/sendChatAction" \
-H 'Content-Type: application/json' \
-d '{"chat_id": 1, "action": "typing"}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/sendChatAction`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"chat_id": 1, "action": "typing"}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/sendChatAction", json={'chat_id': 1, 'action': 'typing'}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": true
}
Сообщения
sendMessage — Отправить текст
Текст до 4096 символов. Entities / parse_mode не поддерживаются (отправляется как есть; клиенты отображают разметку MinChat, например **жирный**). Для ссылок в тексте строится превью, если не передан disable_web_page_preview или link_preview_options.is_disabled = true.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
Чат: id пользователя (> 0) для личного чата или -conversation_id (< 0) для группы/канала, где бот состоит. @username не поддерживается. |
text
обязательный
|
String |
Текст, 1–4096 символов. |
reply_to_message_id
необязательный
|
Integer |
Ответ на сообщение этого же чата. |
disable_web_page_preview
необязательный
|
Boolean |
true отключает превью ссылок из текста (устаревший параметр Telegram). |
link_preview_options
необязательный
|
LinkPreviewOptions |
Объект или JSON-строка, например {"is_disabled": true}. Поддерживается только is_disabled, остальные поля игнорируются. |
reply_markup
необязательный
|
InlineKeyboardMarkup |
Inline-клавиатура (объект или JSON-строка). Поддерживается только InlineKeyboardMarkup. |
Возвращает:
Message
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/sendMessage" \
-H 'Content-Type: application/json' \
-d '{"chat_id": 1, "text": "Pick a city:", "reply_markup": {"inline_keyboard": [[{"text": "Moscow", "callback_data": "city:moscow"}]]}}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/sendMessage`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"chat_id": 1, "text": "Pick a city:", "reply_markup": {"inline_keyboard": [[{"text": "Moscow", "callback_data": "city:moscow"}]]}}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/sendMessage", json={'chat_id': 1, 'text': 'Pick a city:', 'reply_markup': {'inline_keyboard': [[{'text': 'Moscow', 'callback_data': 'city:moscow'}]]}}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": {
"message_id": 50,
"date": 1792660008,
"chat": {
"id": 1,
"type": "private",
"first_name": "Anna",
"username": "anna_s"
},
"from": {
"id": 5,
"is_bot": true,
"first_name": "Weather",
"last_name": "Bot",
"username": "weather_bot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false
},
"text": "Pick a city:",
"reply_markup": {
"inline_keyboard": [
[
{
"text": "Moscow",
"callback_data": "city:moscow"
},
{
"text": "Berlin",
"callback_data": "city:berlin"
}
],
[
{
"text": "Open website",
"url": "https://minchatapp.com"
}
]
]
}
}
}
editMessageText — Изменить текст
Только сообщения этого бота. reply_markup заменяет клавиатуру; пустая строка — убирает. При смене текста превью ссылок пересобирается; disable_web_page_preview / link_preview_options.is_disabled убирает его.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
необязательный
|
Integer |
Для совместимости; сообщение ищется по message_id. |
message_id
обязательный
|
Integer |
id сообщения. |
text
обязательный
|
String |
Новый текст, 1–4096. |
disable_web_page_preview
необязательный
|
Boolean |
true отключает превью ссылок из текста (устаревший параметр Telegram). |
link_preview_options
необязательный
|
LinkPreviewOptions |
Объект или JSON-строка, например {"is_disabled": true}. Поддерживается только is_disabled, остальные поля игнорируются. |
reply_markup
необязательный
|
InlineKeyboardMarkup |
Inline-клавиатура (объект или JSON-строка). Поддерживается только InlineKeyboardMarkup. |
Возвращает:
Message
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/editMessageText" \
-H 'Content-Type: application/json' \
-d '{"chat_id": 1, "message_id": 50, "text": "Moscow: +5°C, cloudy ☁️"}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/editMessageText`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"chat_id": 1, "message_id": 50, "text": "Moscow: +5°C, cloudy ☁️"}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/editMessageText", json={'chat_id': 1, 'message_id': 50, 'text': 'Moscow: +5°C, cloudy ☁️'}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": {
"message_id": 50,
"date": 1792660008,
"chat": {
"id": 1,
"type": "private",
"first_name": "Anna",
"username": "anna_s"
},
"from": {
"id": 5,
"is_bot": true,
"first_name": "Weather",
"last_name": "Bot",
"username": "weather_bot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false
},
"text": "Moscow: +5°C, cloudy ☁️",
"reply_markup": {
"inline_keyboard": [
[
{
"text": "Refresh",
"callback_data": "refresh:moscow"
}
]
]
}
}
}
editMessageReplyMarkup — Изменить клавиатуру
{"inline_keyboard":[]} или отсутствие reply_markup убирает клавиатуру.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
необязательный
|
Integer |
Для совместимости. |
message_id
обязательный
|
Integer |
id сообщения. |
reply_markup
необязательный
|
InlineKeyboardMarkup |
Inline-клавиатура (объект или JSON-строка). Поддерживается только InlineKeyboardMarkup. |
Возвращает:
Message
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/editMessageReplyMarkup" \
-H 'Content-Type: application/json' \
-d '{"chat_id": 1, "message_id": 50, "reply_markup": {"inline_keyboard": []}}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/editMessageReplyMarkup`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"chat_id": 1, "message_id": 50, "reply_markup": {"inline_keyboard": []}}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/editMessageReplyMarkup", json={'chat_id': 1, 'message_id': 50, 'reply_markup': {'inline_keyboard': []}}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": {
"message_id": 50,
"date": 1792660008,
"chat": {
"id": 1,
"type": "private",
"first_name": "Anna",
"username": "anna_s"
},
"from": {
"id": 5,
"is_bot": true,
"first_name": "Weather",
"last_name": "Bot",
"username": "weather_bot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false
},
"text": "Moscow: +5°C, cloudy ☁️"
}
}
deleteMessage — Удалить сообщение
Удаляет у всех сообщение, отправленное этим ботом.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
необязательный
|
Integer |
Для совместимости. |
message_id
обязательный
|
Integer |
id сообщения. |
Возвращает:
True
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/deleteMessage" \
-H 'Content-Type: application/json' \
-d '{"message_id": 50}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/deleteMessage`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"message_id": 50}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/deleteMessage", json={'message_id': 50}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": true
}
pinChatMessage — Закрепить сообщение
Добавляет сообщение в закреплённые (до 5 на чат). Повторный закреп уже закреплённого возвращает true. В группах появляется служебное «закрепил(а) сообщение», если не передан disable_notification. Бот должен быть владельцем или администратором группы/канала (в личке с пользователем — всегда можно). Ошибки: 403 Forbidden: not enough rights to manage pinned messages in the chat, 400 Bad Request: message not found (нет такого, удалено или из другого чата). 400 Bad Request: too many pinned messages (limit 5) — при превышении лимита.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
id чата: id пользователя для лички, -<id беседы> для группы или канала. |
message_id
обязательный
|
Integer |
id сообщения для закрепа. |
disable_notification
необязательный
|
Boolean |
true — закрепить тихо (без служебного сообщения в группах). |
Возвращает:
True
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/pinChatMessage" \
-H 'Content-Type: application/json' \
-d '{"chat_id": -42, "message_id": 50}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/pinChatMessage`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"chat_id": -42, "message_id": 50}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/pinChatMessage", json={'chat_id': -42, 'message_id': 50}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": true
}
unpinChatMessage — Открепить сообщение
Убирает сообщение из закреплённых. Без message_id открепляется последнее закреплённое; если закрепов нет — true. Бот должен быть владельцем или администратором группы/канала (в личке с пользователем — всегда можно). Ошибки: 403 Forbidden: not enough rights to manage pinned messages in the chat, 400 Bad Request: message not found (нет такого, удалено или из другого чата).
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
id чата: id пользователя для лички, -<id беседы> для группы или канала. |
message_id
необязательный
|
Integer |
id сообщения. Если не указан — открепляется последнее. |
Возвращает:
True
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/unpinChatMessage" \
-H 'Content-Type: application/json' \
-d '{"chat_id": -42, "message_id": 50}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/unpinChatMessage`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"chat_id": -42, "message_id": 50}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/unpinChatMessage", json={'chat_id': -42, 'message_id': 50}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": true
}
unpinAllChatMessages — Открепить все сообщения
Очищает список закреплённых сообщений чата. Бот должен быть владельцем или администратором группы/канала (в личке — всегда можно). Ошибка: 403 Forbidden: not enough rights to manage pinned messages in the chat.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
id чата: id пользователя для лички, -<id беседы> для группы или канала. |
Возвращает:
True
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/unpinAllChatMessages" \
-H 'Content-Type: application/json' \
-d '{"chat_id": -42}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/unpinAllChatMessages`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"chat_id": -42}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/unpinAllChatMessages", json={'chat_id': -42}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": true
}
Файлы и медиа
sendPhoto — Отправить фото
photo — файл (multipart), URL, который сервер скачает (≤ 50 МБ), или file_id, ранее полученный этим ботом. MIME: image/*. Для ссылок в подписи превью не создаётся (как в Telegram); disable_web_page_preview / link_preview_options принимаются для совместимости.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
Чат: id пользователя (> 0) для личного чата или -conversation_id (< 0) для группы/канала, где бот состоит. @username не поддерживается. |
photo
обязательный
|
InputFile | String |
Файл, URL или file_id. |
caption
необязательный
|
String |
Подпись, 0–1024 символа. |
reply_to_message_id
необязательный
|
Integer |
Ответ на сообщение этого же чата. |
disable_web_page_preview
необязательный
|
Boolean |
true отключает превью ссылок из текста (устаревший параметр Telegram). |
link_preview_options
необязательный
|
LinkPreviewOptions |
Объект или JSON-строка, например {"is_disabled": true}. Поддерживается только is_disabled, остальные поля игнорируются. |
reply_markup
необязательный
|
InlineKeyboardMarkup |
Inline-клавиатура (объект или JSON-строка). Поддерживается только InlineKeyboardMarkup. |
Возвращает:
Message
curl -F chat_id=1 -F caption='Forecast map' -F photo=@file.png \
"https://minchatapp.com/bot$BOT_TOKEN/sendPhoto"
import { readFile } from 'node:fs/promises';
const form = new FormData();
form.append('chat_id', '1');
form.append('caption', 'Forecast map');
form.append('photo', new Blob([await readFile('file.png')]), 'file.png');
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/sendPhoto`, { method: 'POST', body: form });
const data = await res.json();
if (!data.ok) throw new Error(data.description);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
with open('file.png', 'rb') as fh:
r = requests.post(f"{API}/sendPhoto", data={'chat_id': 1, 'caption': 'Forecast map'}, files={'photo': fh}, timeout=60)
r.raise_for_status()
print(r.json()['result'])
{
"ok": true,
"result": {
"message_id": 52,
"date": 1792660008,
"chat": {
"id": 1,
"type": "private",
"first_name": "Anna",
"username": "anna_s"
},
"from": {
"id": 5,
"is_bot": true,
"first_name": "Weather",
"last_name": "Bot",
"username": "weather_bot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false
},
"caption": "Forecast map",
"photo": [
{
"file_id": "dc16f474-b747-4b41-9ba4-f61593ff883e",
"file_unique_id": "3802d3007f292b24",
"width": 64,
"height": 40,
"file_size": 146
}
]
}
}
sendDocument — Отправить файл
document — файл (multipart), URL, который сервер скачает (≤ 50 МБ), или file_id, ранее полученный этим ботом. MIME: any type.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
Чат: id пользователя (> 0) для личного чата или -conversation_id (< 0) для группы/канала, где бот состоит. @username не поддерживается. |
document
обязательный
|
InputFile | String |
Файл, URL или file_id. |
caption
необязательный
|
String |
Подпись, 0–1024 символа. |
reply_to_message_id
необязательный
|
Integer |
Ответ на сообщение этого же чата. |
reply_markup
необязательный
|
InlineKeyboardMarkup |
Inline-клавиатура (объект или JSON-строка). Поддерживается только InlineKeyboardMarkup. |
Возвращает:
Message
curl -F chat_id=1 -F caption='Forecast map' -F document=@file.pdf \
"https://minchatapp.com/bot$BOT_TOKEN/sendDocument"
import { readFile } from 'node:fs/promises';
const form = new FormData();
form.append('chat_id', '1');
form.append('caption', 'Forecast map');
form.append('document', new Blob([await readFile('file.pdf')]), 'file.pdf');
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/sendDocument`, { method: 'POST', body: form });
const data = await res.json();
if (!data.ok) throw new Error(data.description);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
with open('file.pdf', 'rb') as fh:
r = requests.post(f"{API}/sendDocument", data={'chat_id': 1, 'caption': 'Forecast map'}, files={'document': fh}, timeout=60)
r.raise_for_status()
print(r.json()['result'])
{
"ok": true,
"result": {
"message_id": 53,
"date": 1792660008,
"chat": {
"id": 1,
"type": "private",
"first_name": "Anna",
"username": "anna_s"
},
"from": {
"id": 5,
"is_bot": true,
"first_name": "Weather",
"last_name": "Bot",
"username": "weather_bot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false
},
"caption": "Same file, re-sent by file_id",
"document": {
"file_id": "009953e4-f1d2-466f-aea9-b94328ecec7a",
"file_unique_id": "3802d3007f292b24",
"file_name": "map.png",
"mime_type": "image/png",
"file_size": 146
}
}
}
sendVideo — Отправить видео
video — файл (multipart), URL, который сервер скачает (≤ 50 МБ), или file_id, ранее полученный этим ботом. MIME: video/*. Для ссылок в подписи превью не создаётся (как в Telegram); disable_web_page_preview / link_preview_options принимаются для совместимости.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
Чат: id пользователя (> 0) для личного чата или -conversation_id (< 0) для группы/канала, где бот состоит. @username не поддерживается. |
video
обязательный
|
InputFile | String |
Файл, URL или file_id. |
caption
необязательный
|
String |
Подпись, 0–1024 символа. |
reply_to_message_id
необязательный
|
Integer |
Ответ на сообщение этого же чата. |
disable_web_page_preview
необязательный
|
Boolean |
true отключает превью ссылок из текста (устаревший параметр Telegram). |
link_preview_options
необязательный
|
LinkPreviewOptions |
Объект или JSON-строка, например {"is_disabled": true}. Поддерживается только is_disabled, остальные поля игнорируются. |
reply_markup
необязательный
|
InlineKeyboardMarkup |
Inline-клавиатура (объект или JSON-строка). Поддерживается только InlineKeyboardMarkup. |
Возвращает:
Message
curl -F chat_id=1 -F caption='Forecast map' -F video=@file.mp4 \
"https://minchatapp.com/bot$BOT_TOKEN/sendVideo"
import { readFile } from 'node:fs/promises';
const form = new FormData();
form.append('chat_id', '1');
form.append('caption', 'Forecast map');
form.append('video', new Blob([await readFile('file.mp4')]), 'file.mp4');
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/sendVideo`, { method: 'POST', body: form });
const data = await res.json();
if (!data.ok) throw new Error(data.description);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
with open('file.mp4', 'rb') as fh:
r = requests.post(f"{API}/sendVideo", data={'chat_id': 1, 'caption': 'Forecast map'}, files={'video': fh}, timeout=60)
r.raise_for_status()
print(r.json()['result'])
sendAudio — Отправить аудио
audio — файл (multipart), URL, который сервер скачает (≤ 50 МБ), или file_id, ранее полученный этим ботом. MIME: audio/* or application/ogg.
Параметры
| Имя | Тип | Описание |
|---|---|---|
chat_id
обязательный
|
Integer |
Чат: id пользователя (> 0) для личного чата или -conversation_id (< 0) для группы/канала, где бот состоит. @username не поддерживается. |
audio
обязательный
|
InputFile | String |
Файл, URL или file_id. |
caption
необязательный
|
String |
Подпись, 0–1024 символа. |
reply_to_message_id
необязательный
|
Integer |
Ответ на сообщение этого же чата. |
reply_markup
необязательный
|
InlineKeyboardMarkup |
Inline-клавиатура (объект или JSON-строка). Поддерживается только InlineKeyboardMarkup. |
Возвращает:
Message
curl -F chat_id=1 -F caption='Forecast map' -F audio=@file.mp3 \
"https://minchatapp.com/bot$BOT_TOKEN/sendAudio"
import { readFile } from 'node:fs/promises';
const form = new FormData();
form.append('chat_id', '1');
form.append('caption', 'Forecast map');
form.append('audio', new Blob([await readFile('file.mp3')]), 'file.mp3');
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/sendAudio`, { method: 'POST', body: form });
const data = await res.json();
if (!data.ok) throw new Error(data.description);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
with open('file.mp3', 'rb') as fh:
r = requests.post(f"{API}/sendAudio", data={'chat_id': 1, 'caption': 'Forecast map'}, files={'audio': fh}, timeout=60)
r.raise_for_status()
print(r.json()['result'])
getFile — Информация о файле
Возвращает file_path для файлов, отправленных этим ботом (file_id привязан к боту). Скачивание: GET /file/bot<token>/<file_path>.
Параметры
| Имя | Тип | Описание |
|---|---|---|
file_id
обязательный
|
String |
id файла. |
Возвращает:
File
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/getFile" \
-H 'Content-Type: application/json' \
-d '{"file_id": "dc16f474-b747-4b41-9ba4-f61593ff883e"}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/getFile`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"file_id": "dc16f474-b747-4b41-9ba4-f61593ff883e"}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/getFile", json={'file_id': 'dc16f474-b747-4b41-9ba4-f61593ff883e'}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": {
"file_id": "dc16f474-b747-4b41-9ba4-f61593ff883e",
"file_unique_id": "3802d3007f292b245acabbcc606f7e00",
"file_size": 146,
"file_path": "media/cc/fc/ccfcc4cd72fa42b444b4c2c4837bb847ae6897be6fc4ad9a59eb63cce11df4f8.png"
}
}
Inline-клавиатуры
answerCallbackQuery — Ответить на нажатие кнопки
Сохраняет ответ на callback-запрос (учитывается первый). text ≤ 200 символов.
Параметры
| Имя | Тип | Описание |
|---|---|---|
callback_query_id
обязательный
|
String |
callback_query.id из апдейта. |
text
необязательный
|
String |
Текст уведомления. |
show_alert
необязательный
|
Boolean |
Показать алертом вместо тоста. |
Возвращает:
True
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/answerCallbackQuery" \
-H 'Content-Type: application/json' \
-d '{"callback_query_id": "1", "text": "Moscow: +5°C, cloudy"}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/answerCallbackQuery`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"callback_query_id": "1", "text": "Moscow: +5°C, cloudy"}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/answerCallbackQuery", json={'callback_query_id': '1', 'text': 'Moscow: +5°C, cloudy'}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": true
}
Получение обновлений
getUpdates — Получить апдейты (long polling)
Возвращает накопленные апдейты по порядку. Передайте offset = последний update_id + 1 для подтверждения (старые удаляются). 409, пока установлен webhook.
Параметры
| Имя | Тип | Описание |
|---|---|---|
offset
необязательный
|
Integer |
Первый возвращаемый update_id; подтверждает предыдущие. |
limit
необязательный
|
Integer |
1–100, по умолчанию 100. |
timeout
необязательный
|
Integer |
Секунды ожидания, 0–50 (по умолчанию 0). |
Возвращает:
Array of Update
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/getUpdates" \
-H 'Content-Type: application/json' \
-d '{"offset": 0, "timeout": 30}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/getUpdates`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"offset": 0, "timeout": 30}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/getUpdates", json={'offset': 0, 'timeout': 30}, timeout=60)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": [
{
"update_id": 1,
"message": {
"message_id": 51,
"date": 1792660008,
"chat": {
"id": 1,
"type": "private",
"first_name": "Anna",
"username": "anna_s"
},
"from": {
"id": 1,
"is_bot": false,
"first_name": "Anna",
"last_name": "Smith",
"username": "anna_s"
},
"text": "/weather Moscow"
}
},
{
"update_id": 3,
"callback_query": {
"id": "1",
"from": {
"id": 1,
"is_bot": false,
"first_name": "Anna",
"last_name": "Smith",
"username": "anna_s"
},
"chat_instance": "8",
"data": "city:moscow",
"message": {
"message_id": 50,
"date": 1792660008,
"chat": {
"id": 1,
"type": "private",
"first_name": "Anna",
"username": "anna_s"
},
"from": {
"id": 5,
"is_bot": true,
"first_name": "Weather",
"last_name": "Bot",
"username": "weather_bot",
"can_join_groups": true,
"can_read_all_group_messages": false,
"supports_inline_queries": false
},
"text": "Pick a city:",
"reply_markup": {
"inline_keyboard": [
[
{
"text": "Moscow",
"callback_data": "city:moscow"
},
{
"text": "Berlin",
"callback_data": "city:berlin"
}
],
[
{
"text": "Open website",
"url": "https://minchatapp.com"
}
]
]
}
}
}
}
]
}
setWebhook — Установить webhook
Только HTTPS. Каждый апдейт отправляется POST-запросом с JSON; ответ 2xx — доставлено, иначе повтор (3 попытки, интервал 30 с). С secret_token передаётся заголовок X-Telegram-Bot-Api-Secret-Token. Накопленные апдейты отправляются сразу. Пустой url удаляет webhook.
Параметры
| Имя | Тип | Описание |
|---|---|---|
url
обязательный
|
String |
HTTPS URL. |
secret_token
необязательный
|
String |
Возвращается в X-Telegram-Bot-Api-Secret-Token. |
max_connections
необязательный
|
Integer |
Сохраняется и отображается (по умолчанию 40). |
allowed_updates
необязательный
|
Array of String |
Сохраняется и отображается; фильтрация пока не применяется. |
Возвращает:
True
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/setWebhook" \
-H 'Content-Type: application/json' \
-d '{"url": "https://example.com/minchat-webhook"}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/setWebhook`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"url": "https://example.com/minchat-webhook"}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/setWebhook", json={'url': 'https://example.com/minchat-webhook'}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": true
}
deleteWebhook — Удалить webhook
Возврат к getUpdates.
Параметры
Без параметров.
Возвращает:
True
curl "https://minchatapp.com/bot$BOT_TOKEN/deleteWebhook"
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/deleteWebhook`);
const data = await res.json();
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
print(requests.get(f"{API}/deleteWebhook", timeout=10).json()['result'])
{
"ok": true,
"result": true
}
getWebhookInfo — Статус webhook
url пустой, если webhook не задан. Есть pending_update_count и последняя ошибка.
Параметры
Без параметров.
Возвращает:
WebhookInfo
curl "https://minchatapp.com/bot$BOT_TOKEN/getWebhookInfo"
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/getWebhookInfo`);
const data = await res.json();
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
print(requests.get(f"{API}/getWebhookInfo", timeout=10).json()['result'])
{
"ok": true,
"result": {
"url": "https://example.com/minchat-webhook",
"has_custom_certificate": false,
"pending_update_count": 0,
"max_connections": 40
}
}
Команды
setMyCommands — Задать список команд
Заменяет команды для scope.type (по умолчанию default) и language_code. command ≤ 32, description ≤ 256 символов.
Параметры
| Имя | Тип | Описание |
|---|---|---|
commands
обязательный
|
Array of BotCommand |
[{"command":"start","description":"…"}] (объект или JSON-строка). |
scope
необязательный
|
BotCommandScope |
Сохраняется только type. |
language_code
необязательный
|
String |
Код языка, пусто — все. |
Возвращает:
True
curl -X POST "https://minchatapp.com/bot$BOT_TOKEN/setMyCommands" \
-H 'Content-Type: application/json' \
-d '{"commands": [{"command": "start", "description": "Start the bot"}]}'
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/setMyCommands`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"commands": [{"command": "start", "description": "Start the bot"}]}),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
r = requests.post(f"{API}/setMyCommands", json={'commands': [{'command': 'start', 'description': 'Start the bot'}]}, timeout=10)
data = r.json()
if not data['ok']:
raise RuntimeError(data['description'])
print(data['result'])
{
"ok": true,
"result": true
}
getMyCommands — Получить список команд
Параметры
| Имя | Тип | Описание |
|---|---|---|
scope
необязательный
|
BotCommandScope |
Область ( type). |
language_code
необязательный
|
String |
Код языка. |
Возвращает:
Array of BotCommand
curl "https://minchatapp.com/bot$BOT_TOKEN/getMyCommands"
const res = await fetch(`https://minchatapp.com/bot${process.env.BOT_TOKEN}/getMyCommands`);
const data = await res.json();
console.log(data.result);
import os, requests
API = f"https://minchatapp.com/bot{os.environ['BOT_TOKEN']}"
print(requests.get(f"{API}/getMyCommands", timeout=10).json()['result'])
{
"ok": true,
"result": [
{
"command": "start",
"description": "Start the bot"
},
{
"command": "weather",
"description": "Current weather"
}
]
}
Типы#
Update #
update_id | Integer |
message | Message? |
edited_message | Message? |
callback_query | CallbackQuery? |
User #
id | Integer |
is_bot | Boolean |
first_name | String |
last_name | String? |
username | String? |
can_join_groups | Boolean? (bots) |
can_read_all_group_messages | Boolean? (bots) |
supports_inline_queries | Boolean? (bots) |
Chat #
id | Integer — user id (private) or -conversation_id |
type | private | group | channel |
title | String? (group/channel) |
first_name | String? (private) |
username | String? |
Message #
message_id | Integer |
date | Integer (Unix time) |
chat | Chat |
from | User? |
sender_chat | Chat? (channels) |
reply_to_message | Message? |
text | String? |
caption | String? |
photo | PhotoSize[]? |
video | Video? |
audio | Audio? |
document | Document? |
reply_markup | InlineKeyboardMarkup? |
CallbackQuery #
id | String |
from | User |
chat_instance | String (conversation id) |
data | String |
message | Message |
InlineKeyboardMarkup #
inline_keyboard | InlineKeyboardButton[][] |
LinkPreviewOptions #
is_disabled | Boolean? |
PhotoSize / Document / Video / Audio #
file_id | String (UUID) |
file_unique_id | String |
file_size | Integer |
width, height | Integer (photo, video) |
duration | Integer (video, audio) |
mime_type | String? |
file_name | String? (document, audio) |
File #
file_id | String |
file_unique_id | String |
file_size | Integer |
file_path | String — use /file/bot<token>/<file_path> |
BotCommand #
command | String, ≤ 32 |
description | String, ≤ 256 |
WebhookInfo #
url | String (empty if none) |
has_custom_certificate | Boolean (always false) |
pending_update_count | Integer |
last_error_date | Integer? |
last_error_message | String? |
max_connections | Integer? |
allowed_updates | String[]? |