Visual Telegram MarkdownV2 & HTML markup editor, message bubble simulator, TMA InitData decoder, 64-byte callback checker, bot command & deep-link builder, and multi-language payload generator. All processing runs 100% locally in your browser.
Highlighted characters are MarkdownV2 reserved characters not preceded by \. Some may be intentional formatting (e.g. * around bold text) — this is a raw diagnostic, not an entity-aware parser. Use Auto-Escape Text to escape everything literally.
This inspector decodes the launch parameters so you can read what Telegram sent. It deliberately does not check the signature — verifying initData needs your bot token, and keeping one verified implementation instead of two means there is only one place for the algorithm to be wrong. For HMAC-SHA256 verification, signing, and the step-by-step algorithm trace, use Telegram Webhook Tester.
Order is preserved exactly as sent — Telegram shows the menu in this order, not alphabetically.
Paste any of the four shapes above — the components and the decoded payload appear on the right.
| Key | Parsed Value |
|---|---|
| {{ item.key }} | {{ item.value }}{{ item.value }} |
{{ qrError }}
Paste a deep link on the left to take it apart.
{{ decodedLink.error }}
| {{ row.key }} | {{ row.value }} |
Telegram Studio covers the outbound half of Telegram development — everything you compose and send. Escape MarkdownV2 & HTML special characters with an XSS-safe allowlist-sanitized preview, decode TMA initData fields, inspect 64-byte callback limits, build BotFather command lists and start/startapp deep links, and generate production-ready, method-aware code snippets.
Command scopes. A bot does not have one command list, it has one list per (scope, language_code) pair, and Telegram resolves the most specific scope that matches before falling back to the empty-language list. The catch nobody documents in the same place: BotFather's /setcommands prompt cannot set either of them. It always writes the default, all-languages list. Anything narrower — a groups-only list, an admins-only list, a Russian list — has to go through the setMyCommands API, which is why this tab tells you which of the two routes your current settings actually allow.
Deep links. ?start= opens the bot chat with a payload, ?startapp= launches the Mini App, https://t.me/<bot>/<app>?startapp= launches a specific named Mini App, and ?startattach= opens the attachment menu. All of them share one hard rule: the payload may be at most 64 characters from A–Z a–z 0–9 _ - only. That character set is exactly base64url, and exactly not standard base64 — which emits +, / and = and produces a link Telegram silently refuses to carry. Encoding is base64url here by default for that reason, and the builder shows the encoded length because base64 inflates a payload by roughly a third, so 64 characters of link is closer to 47 bytes of data.
Companion tools: for the inbound half — decoding webhook Update payloads, replaying them to your endpoint, and cryptographically verifying initData or Login Widget callbacks — use Telegram Webhook Tester. To charge for any of it, build the createInvoiceLink payload with Telegram Stars Invoice.