Formato de texto para Telegram: negrita, spoiler, MarkdownV2
Escribe con negrita, cursiva, subrayado, tachado, spoilers, código, enlaces y citas, mira cómo cambia la vista previa y copia el texto tal como lo quiere Telegram: MarkdownV2 con cada símbolo escapado, HTML o entities con desplazamientos en UTF-16.
Marcado: **negrita**, __cursiva__, ++subrayado++, ~~tachado~~, ||spoiler||, `código`, una valla ``` en su propia línea para un bloque de código, [texto](url), una línea que empiece por > para una cita y por >> para una cita desplegable. Una barra invertida deja el símbolo tal cual. Ctrl o Cmd con B, I y U también funcionan.
Vista previa
Enviamos a todo el mundo desde el lunes.
Para bots y la Bot API
*Día de lanzamiento\.* La nueva _colección_ ya está a la venta: ~49~ 29 USD, y los primeros 50 pedidos van con envío gratis\. ||Código de descuento: FIRST50|| Detalles: [en la tienda](https://example.com/shop) >Enviamos a todo el mundo desde el lunes\.
Envíalo con parse_mode=MarkdownV2. Cada carácter especial ya viene escapado.
<b>Día de lanzamiento.</b> La nueva <i>colección</i> ya está a la venta: <s>49</s> 29 USD, y los primeros 50 pedidos van con envío gratis. <tg-spoiler>Código de descuento: FIRST50</tg-spoiler> Detalles: <a href="https://example.com/shop">en la tienda</a> <blockquote>Enviamos a todo el mundo desde el lunes.</blockquote>
Envíalo con parse_mode=HTML. Los <, > y & de tu texto ya están reemplazados.
[
{
"type": "bold",
"offset": 0,
"length": 19
},
{
"type": "italic",
"offset": 29,
"length": 9
},
{
"type": "strikethrough",
"offset": 59,
"length": 2
},
{
"type": "spoiler",
"offset": 118,
"length": 28
},
{
"type": "text_link",
"offset": 157,
"length": 12,
"url": "https://example.com/shop"
},
{
"type": "blockquote",
"offset": 170,
"length": 40
}
]Envía el texto plano como text y este array como entities, sin parse_mode. Desplazamientos y longitudes en unidades UTF-16.
Los límites se cuentan sobre el texto sin marcado: 4.096 caracteres por mensaje, 1.024 por pie de foto. Cómo funciona el recuento
El formato en Telegram no es tipografía, son datos. Una palabra en negrita es una entity: un tipo, un desplazamiento y una longitud pegados a texto plano. Las apps la dibujan, los bots la envían, y todo lo que falla en un mensaje con formato falla en el punto donde el texto se convierte en entities.
Diez estilos, un solo marcado
El campo de arriba acepta un marcado pequeño y lo convierte en entities mientras escribes: **negrita**, __cursiva__, ++subrayado++, ~~tachado~~, ||spoiler||, un par de acentos graves para código en línea, una valla ``` en su propia línea para un bloque de código (el lenguaje va después de la valla de apertura), [texto](url) para un enlace, y una línea que empieza por > para una cita o por >> para una desplegable. Una barra invertida delante de cualquiera de estos símbolos lo deja como texto. Los estilos se anidan, así que un enlace puede ir dentro de una negrita y una negrita dentro de una cita; el código no contiene nada, y una cita no contiene ni otra cita ni un bloque de código. Ese es el conjunto de reglas de anidamiento que aplica Telegram, no una limitación de esta página.
La vista previa muestra lo que significan las entities, no cómo las dibuja píxel a píxel una app concreta. Los spoilers siguen ocultos hasta que los tocas. El contador bajo el campo mide el texto sin el marcado, porque ese es el texto que mide Telegram.
MarkdownV2: el escapado que rompe bots
parse_mode=MarkdownV2 es el formato que enseñan casi todos los tutoriales y el que está detrás de casi todos los errores «can’t parse entities». La regla es corta y no perdona: fuera del código, cada uno de los caracteres _ * [ ] ( ) ~ ` > # + - = | { } . ! tiene que ir precedido de una barra invertida, y la propia barra también. Un solo punto sin escapar al final de una frase basta para que la API rechace el mensaje entero. Dentro de code y pre solo se escapan el acento grave y la barra; dentro de la parte de la dirección de un enlace, solo el paréntesis de cierre y la barra.
Hay una trampa más. Dos guiones bajos se leen siempre como subrayado, con avidez, de izquierda a derecha, así que una cursiva que termina justo donde termina un subrayado no se puede escribir a la ligera. La solución documentada es cerrar la cursiva, insertar una entity de negrita vacía ** como separador y solo entonces cerrar el subrayado. La salida MarkdownV2 de arriba hace todo esto, separador incluido, y por eso merece la pena copiarla en vez de volver a teclearla.
HTML: tres caracteres que escapar
parse_mode=HTML es la opción tranquila. Telegram admite una lista fija de etiquetas: b, i, u, s, tg-spoiler, a, code, pre (con un code class="language-…" anidado para nombrar el lenguaje) y blockquote, normal o expandable. Solo tres caracteres de tu texto necesitan atención: <, > y &, reemplazados por <, > y &. Todo lo demás, incluidos los puntos y guiones que hacen frágil a MarkdownV2, se envía tal cual. Es el formato que usa el propio AdminHub cuando publica posts, y el que conviene elegir para cualquier bot escrito desde cero.
Entities, si prefieres no escapar nada
La tercera salida es el array de entities. Envíalo junto con el texto plano y sin parse_mode, y no habrá nada que escapar, porque nada se analiza. Lo único que hay que saber es la unidad: los desplazamientos y longitudes se cuentan en unidades UTF-16, así que un emoji o cualquier carácter fuera del plano multilingüe básico cuenta dos. Exactamente por eso el contador muestra ese número aparte.
Cuánto puede medir un mensaje
Un mensaje admite 4.096 caracteres y un pie de foto 1.024, ambos «tras analizar las entities»: el marcado, las etiquetas y las barras de escape no cuentan, solo el texto que ve quien lee. Los límites se expresan en caracteres, que la configuración de cliente de Telegram cuenta como puntos de código, así que un emoji en negrita es un carácter frente al límite aunque su entity mida dos unidades. El contador de arriba sigue esa regla y cambia entre los dos límites; el generador de fuentes explica la misma distinción para las letras Unicode estilizadas.
Lo que esta herramienta no hace
Los emojis personalizados y las entities de fecha tg-time necesitan un bot con permisos concretos y quedan fuera. El modo Markdown heredado queda fuera a propósito: no anida, no puede expresar subrayado, tachado, spoilers ni citas, y la propia documentación de Telegram remite a MarkdownV2. Los títulos, tablas y listas tampoco forman parte del formato normal de mensajes: Telegram los introdujo en julio de 2026 como un editor de texto enriquecido aparte para usuarios Premium, y para bots son los mensajes enriquecidos de la Bot API 10.1, que es lo que produce el editor de posts de AdminHub. Para los estilos de esta página, todos los clientes de Telegram muestran el mismo resultado.
Fuentes, comprobadas en septiembre de 2026: Bot API, Formatting options para las reglas de escapado de MarkdownV2, la lista de etiquetas HTML, las reglas de anidamiento y los límites «tras analizar las entities»; Bot API, MessageEntity para desplazamientos y longitudes en unidades UTF-16; Styled text with message entities sobre cómo cuentan los clientes las longitudes de las entities; blog de Telegram, 14 de julio de 2026 sobre el editor de texto enriquecido y su disponibilidad solo para Premium.
Lo que la gente suele preguntar
- ¿Cómo pongo texto en negrita en Telegram?
- Escríbelo aquí entre asteriscos dobles, o selecciónalo y pulsa Negrita, y copia el resultado en la forma que necesites. Para un bot, envía el texto como <b>negrita</b> con parse_mode=HTML, o como *negrita* con parse_mode=MarkdownV2, donde el resto de caracteres especiales tiene que ir escapado. Esta página cubre lo que documenta la Bot API, no los botones de cada app.
- ¿Por qué mi bot recibe el error can't parse entities?
- Porque el mensaje se envió con parse_mode=MarkdownV2 y contiene un carácter especial sin escapar, casi siempre un punto, un guion, un signo de exclamación o un paréntesis, o un estilo abierto que nunca se cerró. Con HTML el mismo error viene de una etiqueta sin cerrar o no admitida, o de un < o un & sueltos en el texto. Pega el texto aquí y copia la salida MarkdownV2 o HTML: el escapado y el cierre ya están hechos.
- ¿HTML o MarkdownV2: cuál uso para un bot?
- HTML, salvo que tengas un motivo para no hacerlo. Escapa tres caracteres en vez de dieciocho, no tiene la ambigüedad entre subrayado y cursiva, y es el formato que AdminHub envía a Telegram en cada post con formato. MarkdownV2 está bien cuando tu librería lo construye por ti o cuando lo copias de una herramienta como esta.
- ¿Cómo escondo texto detrás de un spoiler?
- Envuélvelo en barras verticales dobles, ||así||, o selecciónalo y pulsa Spoiler. En MarkdownV2 el spoiler se escribe igual, en HTML es la etiqueta tg-spoiler, y como entity su tipo es spoiler. Quien lee ve un bloque borroso hasta que lo toca.
- ¿Puedo usar títulos, tablas o listas en un mensaje de Telegram?
- Con el formato normal de mensajes no, y esta herramienta no los produce. Telegram añadió títulos, tablas y listas en julio de 2026 como un editor de texto enriquecido aparte, solo para usuarios Premium; para bots pertenecen a los mensajes enriquecidos de la Bot API 10.1, que es como los envía el editor de posts de AdminHub. Todos los estilos de esta página funcionan en cualquier chat.
- ¿Cuánto puede medir un mensaje con formato?
- 4.096 caracteres en un mensaje y 1.024 en el pie de una foto o un vídeo, contados sobre el texto una vez quitado el marcado: las etiquetas, los asteriscos y las barras de escape no cuentan. El contador bajo el campo aplica la misma regla y cambia entre los dos límites.
- ¿Por qué la longitud de la entity no coincide con el número de caracteres?
- Los desplazamientos y longitudes de las entities se cuentan en unidades UTF-16, así que un emoji o cualquier carácter fuera del plano básico cuenta dos, mientras que el límite del mensaje se cuenta en caracteres. El contador muestra los dos números: el primero decide si el mensaje cabe, el segundo es el que va en el array de entities.