Formatar texto no Telegram: negrito, spoiler, MarkdownV2
Escreva com negrito, itálico, sublinhado, tachado, spoilers, código, links e citações, acompanhe a prévia e copie o texto do jeito que o Telegram espera: MarkdownV2 com cada símbolo escapado, HTML ou entities com deslocamentos em UTF-16.
Marcação: **negrito**, __itálico__, ++sublinhado++, ~~tachado~~, ||spoiler||, `código`, uma cerca ``` em linha própria para bloco de código, [texto](url), linha começando com > para citação e >> para citação expansível. Uma barra invertida mantém o símbolo como está. Ctrl ou Cmd com B, I e U também funcionam.
Prévia
Enviamos para o mundo todo a partir de segunda.
Para bots e a Bot API
*Dia de lançamento\.* A nova _coleção_ já está à venda: ~49~ 29 USD, e os 50 primeiros pedidos têm frete grátis\. ||Cupom: FIRST50|| Detalhes: [na loja](https://example.com/shop) >Enviamos para o mundo todo a partir de segunda\.
Envie com parse_mode=MarkdownV2. Todo caractere especial já vem escapado.
<b>Dia de lançamento.</b> A nova <i>coleção</i> já está à venda: <s>49</s> 29 USD, e os 50 primeiros pedidos têm frete grátis. <tg-spoiler>Cupom: FIRST50</tg-spoiler> Detalhes: <a href="https://example.com/shop">na loja</a> <blockquote>Enviamos para o mundo todo a partir de segunda.</blockquote>
Envie com parse_mode=HTML. Os <, > e & do seu texto já foram substituídos.
[
{
"type": "bold",
"offset": 0,
"length": 18
},
{
"type": "italic",
"offset": 26,
"length": 7
},
{
"type": "strikethrough",
"offset": 51,
"length": 2
},
{
"type": "spoiler",
"offset": 106,
"length": 14
},
{
"type": "text_link",
"offset": 131,
"length": 7,
"url": "https://example.com/shop"
},
{
"type": "blockquote",
"offset": 139,
"length": 47
}
]Envie o texto simples em text e este array em entities, sem parse_mode. Deslocamentos e comprimentos em unidades UTF-16.
Os limites são contados sobre o texto sem marcação: 4.096 caracteres por mensagem, 1.024 por legenda. Como a contagem funciona
Formatação no Telegram não é tipografia, é dado. Uma palavra em negrito é uma entity: um tipo, um deslocamento e um comprimento presos a um texto simples. Os aplicativos a desenham, os bots a enviam, e tudo o que dá errado numa mensagem formatada dá errado no ponto em que o texto vira entities.
Dez estilos, uma marcação
O campo acima aceita uma marcação pequena e a transforma em entities enquanto você digita: **negrito**, __itálico__, ++sublinhado++, ~~tachado~~, ||spoiler||, um par de crases para código na linha, uma cerca ``` em linha própria para um bloco de código (a linguagem vai depois da cerca de abertura), [texto](url) para um link, e uma linha começando com > para uma citação ou com >> para uma expansível. Uma barra invertida antes de qualquer desses símbolos o mantém como texto. Os estilos se aninham, então um link pode ficar dentro de um negrito e um negrito dentro de uma citação; código não contém nada, e uma citação não contém nem outra citação nem um bloco de código. Esse é o conjunto de regras de aninhamento que o Telegram aplica, não uma limitação desta página.
A prévia mostra o que as entities significam, não como um aplicativo específico as desenha pixel a pixel. Os spoilers ficam escondidos até você tocar neles. O contador abaixo do campo mede o texto sem a marcação, porque é esse o texto que o Telegram mede.
MarkdownV2: o escape que quebra bots
parse_mode=MarkdownV2 é o formato que a maioria dos tutoriais mostra e o que está por trás da maioria dos erros «can’t parse entities». A regra é curta e não perdoa: fora do código, cada um dos caracteres _ * [ ] ( ) ~ ` > # + - = | { } . ! precisa vir precedido de uma barra invertida, e a própria barra também. Um único ponto final sem escape no fim de uma frase basta para a API rejeitar a mensagem inteira. Dentro de code e pre só a crase e a barra são escapadas; dentro da parte do endereço de um link, só o parêntese de fechamento e a barra.
Há mais uma armadilha. Dois sublinhados são sempre lidos como sublinhado, com avidez, da esquerda para a direita, então um itálico que termina exatamente onde termina um sublinhado não pode ser escrito de forma ingênua. A solução documentada é fechar o itálico, inserir uma entity de negrito vazia ** como separador e só então fechar o sublinhado. A saída MarkdownV2 acima faz tudo isso, separador incluído, e é por isso que vale copiá-la em vez de redigitar.
HTML: três caracteres para escapar
parse_mode=HTML é a opção tranquila. O Telegram aceita uma lista fixa de tags: b, i, u, s, tg-spoiler, a, code, pre (com um code class="language-…" aninhado para nomear a linguagem) e blockquote, comum ou expandable. Só três caracteres do seu texto pedem atenção: <, > e &, substituídos por <, > e &. Todo o resto, inclusive os pontos e hífens que deixam o MarkdownV2 frágil, vai como está. É o formato que o próprio AdminHub usa ao publicar posts, e o que vale escolher para qualquer bot escrito do zero.
Entities, se você preferir não escapar nada
A terceira saída é o array de entities. Envie-o junto com o texto simples e sem parse_mode, e não haverá nada para escapar, porque nada é analisado. A única coisa a saber é a unidade: deslocamentos e comprimentos são contados em unidades UTF-16, então um emoji ou qualquer caractere fora do plano multilíngue básico conta como dois. É exatamente por isso que o contador mostra esse número à parte.
Qual é o tamanho máximo de uma mensagem
Uma mensagem comporta 4.096 caracteres e uma legenda de mídia 1.024, ambos «depois da análise das entities»: marcação, tags e barras de escape não contam, só o texto que o leitor vê. Os limites são declarados em caracteres, que a configuração de cliente do Telegram conta como pontos de código, então um emoji em negrito é um caractere contra o limite mesmo que sua entity tenha duas unidades. O contador acima segue essa regra e alterna entre os dois limites; o gerador de fontes explica a mesma diferença para letras Unicode estilizadas.
O que esta ferramenta não faz
Emojis personalizados e entities de data tg-time exigem um bot com direitos específicos e ficaram de fora. O modo Markdown legado ficou de fora de propósito: ele não aninha, não expressa sublinhado, tachado, spoilers nem citações, e a própria documentação do Telegram aponta para o MarkdownV2. Títulos, tabelas e listas também não fazem parte da formatação comum de mensagens: o Telegram os introduziu em julho de 2026 como um editor de texto rico à parte para usuários Premium, e para bots eles são as mensagens ricas da Bot API 10.1, que é o que o editor de posts do AdminHub produz. Para os estilos desta página, todo cliente do Telegram mostra o mesmo resultado.
Fontes, verificadas em setembro de 2026: Bot API, Formatting options para as regras de escape do MarkdownV2, a lista de tags HTML, as regras de aninhamento e os limites «depois da análise das entities»; Bot API, MessageEntity para deslocamentos e comprimentos em unidades UTF-16; Styled text with message entities sobre como os clientes contam os comprimentos das entities; blog do Telegram, 14 de julho de 2026 sobre o editor de texto rico e sua disponibilidade só para Premium.
O que as pessoas costumam perguntar
- Como deixar o texto em negrito no Telegram?
- Escreva aqui entre asteriscos duplos, ou selecione e toque em Negrito, e copie o resultado na forma que precisar. Para um bot, envie o texto como <b>negrito</b> com parse_mode=HTML, ou como *negrito* com parse_mode=MarkdownV2, onde todos os outros caracteres especiais precisam ser escapados. Esta página cobre o que a Bot API documenta, não os botões de cada aplicativo.
- Por que meu bot recebe o erro can't parse entities?
- Porque a mensagem foi enviada com parse_mode=MarkdownV2 e contém um caractere especial sem escape, quase sempre um ponto, um hífen, um ponto de exclamação ou um parêntese, ou um estilo aberto que nunca foi fechado. Com HTML o mesmo erro vem de uma tag não fechada ou não suportada, ou de um < ou & solto no texto. Cole o texto aqui e copie a saída MarkdownV2 ou HTML: o escape e o fechamento já estão feitos.
- HTML ou MarkdownV2: qual usar em um bot?
- HTML, a menos que você tenha um motivo para não usar. Ele escapa três caracteres em vez de dezoito, não tem a ambiguidade entre sublinhado e itálico, e é o formato que o AdminHub envia ao Telegram em cada post com formatação. MarkdownV2 serve quando sua biblioteca monta o texto por você ou quando você o copia de uma ferramenta como esta.
- Como esconder um texto atrás de um spoiler?
- Envolva o trecho em barras verticais duplas, ||assim||, ou selecione e toque em Spoiler. No MarkdownV2 o spoiler se escreve do mesmo jeito, no HTML é a tag tg-spoiler, e como entity o tipo é spoiler. Quem lê vê um bloco borrado até tocar nele.
- Dá para usar títulos, tabelas ou listas em uma mensagem do Telegram?
- Na formatação comum de mensagens não, e esta ferramenta não os produz. O Telegram acrescentou títulos, tabelas e listas em julho de 2026 como um editor de texto rico à parte, só para usuários Premium; para bots eles pertencem às mensagens ricas da Bot API 10.1, que é como o editor de posts do AdminHub as envia. Todos os estilos desta página funcionam em qualquer conversa.
- Qual é o tamanho máximo de uma mensagem formatada?
- 4.096 caracteres em uma mensagem e 1.024 na legenda de uma mídia, contados sobre o texto depois de remover a marcação: tags, asteriscos e barras de escape não contam. O contador abaixo do campo aplica a mesma regra e alterna entre os dois limites.
- Por que o comprimento da entity é diferente da contagem de caracteres?
- Os deslocamentos e comprimentos das entities são contados em unidades UTF-16, então um emoji ou qualquer caractere fora do plano básico conta como dois, enquanto o limite da mensagem é contado em caracteres. O contador mostra os dois números: o primeiro decide se a mensagem cabe, o segundo é o que vai para o array de entities.