Telegram Bot Custom Commands: setMyCommands and the empty-array delete
Telegram bots can show a command menu when users type / in a chat. Registering commands is a single API call — no approval, no webhook setup, no special bot-side handling.
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/setMyCommands" \
-H "Content-Type: application/json" \
-d '{"commands": [
{"command": "status", "description": "Show active host"},
{"command": "switch", "description": "Switch active host"}
]}'
From the bot's perspective, /status or /switch desktop arrives as plain text in message.text — you parse it like any other message.
Scope-aware deletion
deleteMyCommands supports optional scope and language_code parameters so you can clear commands for specific contexts (private chats, groups, a single chat, a specific language). But there's no API to delete individual commands.
The elegant part: setMyCommands always does a full overwrite. Sending an empty array clears everything:
# These are equivalent:
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/setMyCommands" \
-d '{"commands": []}'
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/deleteMyCommands"
To remove a single command, just setMyCommands with the updated list minus the one you want gone. The overwrite-everything semantics means there's no "add" or "remove" — only "set the complete list." deleteMyCommands is a convenience method, not a necessity.