MarkdownV2 escaper
Telegram rejects a MarkdownV2 message when a special character is not escaped. Paste the text, copy it back with the backslashes in place.
Escape text
Type or paste the text your bot should send. Escaped in your browser.
All 18 special characters and the backslash get a backslash in front.
The rule
Source: Bot API, MarkdownV2 style.
FAQ
Which characters must be escaped in MarkdownV2?
In ordinary text: _ * [ ] ( ) ~ ` > # + - = | { } . ! — each with a preceding backslash. Inside code and pre blocks only the backtick and the backslash; inside the (…) part of a link only the closing parenthesis and the backslash.
What does “can't parse entities: Character '.' is reserved” mean?
Your text contains one of the special characters without a backslash in front of it. Escape all user-supplied text before you put it into a MarkdownV2 message.
Should I escape the whole message?
No — only the parts that are plain text. If you escape the whole message, your own *bold* and _italic_ markers are escaped too and show up literally. Escape each variable, then put it into your template.
Is HTML easier?
Often, yes: with parse_mode=HTML only <, > and & need escaping (as < > &).