Telegram Bot Commands: Complete List and How to Use Them (2026)
Telegram Bot Commands: Complete List and How to Use Them (2026)
Commands are the primary interface between users and Telegram bots. A command is a message starting with / — when Telegram sees a message beginning with a slash, it highlights it as a command and the bot's server receives it as a structured update. Understanding how commands work, which ones are standard across all bots, and how to implement them correctly makes a significant difference in bot usability. This guide covers standard commands, how to configure them via @BotFather, implementation patterns in code, and best practices. Find more development resources in the Developer Tools category, and read our complete PHP bot building guide for hands-on implementation examples.
What Are Telegram Bot Commands?
A Telegram bot command is a message starting with a forward slash (/) followed by a lowercase alphanumeric string. Telegram's client recognizes this format and renders commands with special highlighting. When the user taps a highlighted command in a chat, Telegram sends it to the bot as a text message.
Valid command format:
- Must start with
/ - Followed by 1–32 characters of lowercase letters, digits, and underscores
- Case-insensitive:
/Startand/startare the same command - Optional arguments after the command:
/remind 30min Take the call - Group command disambiguation:
/start@yourbotname(suffixed with the bot's username, used in groups with multiple bots to direct the command to a specific bot)
Standard Commands All Bots Should Implement
Telegram's guidelines define a set of conventional commands that users expect every bot to support. Implementing these creates a consistent experience and helps new users get started without documentation.
/start — Entry Point and Onboarding
The most important command. /start is sent automatically when a user first opens a bot or clicks a deep link. It is the bot's first impression and should:
- Greet the user
- Explain what the bot does in 2–3 sentences
- Show the main menu or inline keyboard with primary actions
- Reference
/helpfor the full command list
/start also accepts a payload parameter for deep linking: t.me/yourbotname?start=referral_code123. The bot receives /start referral_code123 and can use the payload for referral tracking, pre-filling forms, or routing users to specific features.
/help — Command Reference
A formatted list of all available commands with brief descriptions. Users who forget how to use the bot return here. Keep descriptions concise — one line per command. Group commands by category if the list is long.
📋 Available commands:
🔔 Reminders
/remind [time] [text] — Set a reminder
/reminders — List your active reminders
/delete [id] — Delete a reminder
📝 Notes
/note [title] [text] — Save a note
/notes — List saved notes
/delnote [title] — Delete a note
⚙️ Settings
/settings — Open settings menu
/timezone [zone] — Set your timezone
/settings — User Preferences
Opens a settings interface — either an inline keyboard menu or a series of prompts. Common settings: language, timezone, notification preferences, subscription management. Implement /settings as an entry point to the configuration flow rather than requiring users to memorize configuration commands.
/cancel — Abandon Current Flow
Exits any multi-step conversation or operation in progress and returns to the idle state. Essential for any bot with conversation flows. Without /cancel, users who start a flow and change their mind get stuck waiting for the bot's next expected input.
/language (or /lang) — Language Selection
For multilingual bots, this command opens the language selection menu. Alternatively, detect the user's language from the language_code field in the user object and apply it automatically.
Domain-Specific Standard Commands
Beyond the universal commands above, different bot categories have their own conventional commands that users expect:
Group Management Bots
/ban @username [reason]— Ban a user/kick @username— Remove from group without ban/mute @username [duration]— Restrict posting/unmute @username— Restore posting rights/warn @username [reason]— Issue a formal warning/warns @username— List warnings for a user/rules— Display group rules/pin— Pin the replied-to message/unpin— Unpin the current pinned message/admins— List group administrators
Utility Bots
/translate [language] [text]— Translate text/convert [value] [from] to [to]— Unit/currency conversion/weather [city]— Current weather/calc [expression]— Calculator/qr [text]— Generate QR code
Media Bots
/download [url]— Download content from URL/quality [setting]— Set download quality/format [format]— Set output format/queue— View download queue
How to Set Commands via @BotFather
Setting commands in @BotFather makes them appear in the command menu — the list that pops up when a user types / in the bot's chat. This dramatically improves discoverability.
- Open @BotFather and send
/mybots. - Select your bot from the list.
- Tap Edit Bot → Edit Commands.
- Send the command list in the specified format — one command per line, command name followed by description:
start - Welcome message and main menu
help - List of all commands
remind - Set a reminder
reminders - View your active reminders
settings - Configure your preferences
cancel - Cancel current operation
After saving, users who type / in the bot's chat see a scrollable list of available commands with descriptions. Commands set in BotFather appear in both private chats and in groups where the bot is a member.
Scope-Specific Commands (Advanced)
The Bot API supports command scopes: different command lists for different contexts. Use setMyCommands with a scope parameter to set:
- Default scope: Commands visible in all private chats
- All group chats: Commands visible in all groups (typically a subset — admin commands should not appear in the user command menu)
- Specific chat: Commands for a single specific chat or group
- Chat administrators: Admin-only commands visible only to users with admin rights
This prevents users from seeing (and attempting) admin commands they cannot use, reducing confusion and invalid command attempts.
Handling Commands in Code
Python (python-telegram-bot)
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
user = update.effective_user
await update.message.reply_html(
f"Hi {user.mention_html()}! I'm your bot.\n\n"
"Use /help to see what I can do."
)
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
help_text = (
"📋 *Available Commands*\n\n"
"/start — Welcome message\n"
"/help — This help text\n"
"/settings — Configure preferences\n"
"/cancel — Cancel current operation"
)
await update.message.reply_text(help_text, parse_mode="Markdown")
async def remind(update: Update, context: ContextTypes.DEFAULT_TYPE):
# context.args contains everything after /remind as a list
if not context.args:
await update.message.reply_text("Usage: /remind [time] [message]")
return
# Process args...
await update.message.reply_text(f"Reminder set: {' '.join(context.args)}")
app = ApplicationBuilder().token("YOUR_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help_command))
app.add_handler(CommandHandler("remind", remind))
app.run_polling()
PHP (raw webhook)
<?php
$update = json_decode(file_get_contents('php://input'), true);
$message = $update['message'] ?? null;
if (!$message) exit;
$text = $message['text'] ?? '';
$chatId = $message['chat']['id'];
// Extract command (strip @botname suffix in groups)
preg_match('/^\/([a-z0-9_]+)(@\w+)?(\s+(.*))?$/i', $text, $matches);
$command = strtolower($matches[1] ?? '');
$args = trim($matches[4] ?? '');
switch ($command) {
case 'start':
sendMessage($chatId, "Welcome! Use /help to see available commands.");
break;
case 'help':
sendMessage($chatId, "/start — Welcome\n/help — This list\n/echo — Echo text");
break;
case 'echo':
sendMessage($chatId, $args ?: "Please provide text after /echo");
break;
default:
sendMessage($chatId, "Unknown command. Try /help");
}
Best Practices for Bot Commands
- Always implement /start and /help: These are the two commands every user tries first. Missing either creates a poor first impression.
- Always implement /cancel: Any bot with multi-step flows absolutely needs a way out. Without cancel, confused users often just stop using the bot.
- Keep command names short and memorable:
/remindbeats/setreminder. Users type these repeatedly. - Use consistent naming patterns: If you have
/noteand/delnote, the pattern is clear. Inconsistent naming (e.g./addnote,/removenote,/deletenote) creates confusion. - Validate arguments and send usage hints: If a user sends
/remindwithout arguments, respond with the correct usage (/remind 30min Take the call) rather than failing silently or with a generic error. - Handle the @botname suffix in groups: In groups, commands are sometimes sent as
/start@yourbotname. Your command parser must strip the@botnamesuffix before matching, or commands directed at your bot in multi-bot groups will not be recognized. - Set command scopes: Use the Bot API's scope system so admin commands are only visible to admins. This reduces user confusion and support requests.
- Keep the command menu under 20 entries: A very long command list is overwhelming. Group related functions under a settings or menu command rather than exposing every sub-feature as a top-level command.
FAQ
Why doesn't my bot respond to commands in a group?
The most common cause is bot privacy mode. By default, bots only receive commands and direct @mentions in groups — not regular messages. Your command handler works fine in private chats because all messages are received. In groups, verify the message starts with / and that your command handler is not filtering it out. If the bot needs to respond to non-command messages in groups, the bot's privacy mode must be disabled via @BotFather → Bot Settings → Group Privacy → Turn Off.
Can commands have arguments with spaces?
Yes. Everything after the command name (separated by a space) is the argument. In python-telegram-bot, context.args gives you the arguments as a list split by spaces. /remind in 30 minutes Take the call gives context.args = ['in', '30', 'minutes', 'Take', 'the', 'call']. Join them back with ' '.join(context.args) if you need the full text.
How do I update the command list shown to users without restarting the bot?
The command list shown in the Telegram client (the / popup menu) is set via @BotFather or the setMyCommands Bot API call. Updating it does not require a bot restart — it is metadata stored on Telegram's servers. Call setMyCommands with the new list at any time and the change is reflected immediately for all users.
Can I have commands that are only visible to admins?
Yes, using command scopes. Call setMyCommands with scope = {"type": "chat_administrators", "chat_id": YOUR_GROUP_ID} to set commands visible only to group administrators. Regular members see the default command set; admins see the admin-specific commands in addition.
What is the maximum number of commands a bot can have?
Telegram limits the command list set via setMyCommands to 100 commands per scope. This is more than sufficient for any real-world bot. If you have more than 100 commands, consider restructuring — a menu-based navigation system is more usable than 100+ raw commands anyway.
Share this article