Telegram Bot API
🌐 Español

Webhook de Telegram: cómo configurar setWebhook para tu bot (Python y n8n)

· 7 min de lectura

Un webhook hace que Telegram envíe cada actualización de tu bot, por POST y en JSON, a una URL HTTPS tuya en cuanto ocurre. Para configurar el webhook de un bot de Telegram llamas a setWebhook con esa URL (y, de preferencia, un secret_token), compruebas el estado con getWebhookInfo y respondes a cada petición con un código 2xx.

Webhook o getUpdates: cuál elegir

getUpdates (long polling)Webhook
Quién iniciaTu código pregunta a TelegramTelegram llama a tu servidor
RequisitosNinguno, funciona en localhostURL pública con HTTPS
Ideal paraDesarrollo, scripts, bots pequeñosProducción, serverless, n8n

No puedes usar ambos a la vez: mientras haya un webhook activo, getUpdates responde 409 Conflict. Si todavía no tienes bot, empieza por cómo crear un bot en Telegram.

Requisitos del webhook

Configurar el webhook con setWebhook

curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/setWebhook" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://bot.example.com/telegram/webhook",
    "secret_token": "mi_secreto-2026",
    "allowed_updates": ["message", "callback_query"],
    "drop_pending_updates": true,
    "max_connections": 40
  }'

Si todo va bien, la respuesta es {"ok":true,"result":true,"description":"Webhook was set"}. Los parámetros:

Con certificado autofirmado, la petición debe ser multipart/form-data:

curl -F "url=https://203.0.113.10:8443/webhook" \
  -F "certificate=@public.pem" \
  "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/setWebhook"

También puedes registrar la URL desde el navegador con setWebhook en Bot API Tester.

Verificar el webhook con getWebhookInfo

curl "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/getWebhookInfo"
{
  "ok": true,
  "result": {
    "url": "https://bot.example.com/telegram/webhook",
    "has_custom_certificate": false,
    "pending_update_count": 12,
    "last_error_date": 1793232000,
    "last_error_message": "Wrong response from the webhook: 500 Internal Server Error",
    "max_connections": 40,
    "allowed_updates": ["message", "callback_query"]
  }
}

Fíjate en pending_update_count (actualizaciones esperando entrega) y last_error_message (último error al entregar). Si el contador crece y hay un error reciente, Telegram no logra hablar con tu servidor. Si url está vacía, no hay webhook y el bot usa getUpdates.

Webhook de Telegram en Python: validar el secret_token

Este handler mínimo con Flask rechaza las peticiones sin tu secreto, contesta los mensajes de texto y responde 200:

import hmac
import os

import requests
from flask import Flask, abort, request

TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
SECRET = os.environ["TELEGRAM_WEBHOOK_SECRET"]
API = f"https://api.telegram.org/bot{TOKEN}"

app = Flask(__name__)

@app.post("/telegram/webhook")
def telegram_webhook():
    received = request.headers.get("X-Telegram-Bot-Api-Secret-Token", "")
    if not hmac.compare_digest(received, SECRET):
        abort(403)
    update = request.get_json(silent=True) or {}
    message = update.get("message")
    if message and "text" in message:
        requests.post(f"{API}/sendMessage", timeout=10, json={
            "chat_id": message["chat"]["id"],
            "text": "Recibido: " + message["text"],
        })
    return "", 200

Para dar formato a las respuestas o añadir botones, consulta cómo enviar mensajes con la API.

Volver a getUpdates con deleteWebhook

curl "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/deleteWebhook?drop_pending_updates=true"

Devuelve "result": true y, desde ese momento, getUpdates vuelve a funcionar. Quita drop_pending_updates si quieres conservar las actualizaciones pendientes.

Errores frecuentes

Webhook de Telegram en n8n: por qué falla en localhost

El disparador de Telegram de n8n funciona con webhook: al activar el flujo, n8n registra su propia URL con setWebhook. Si n8n corre en tu computadora con http://localhost, Telegram no puede alcanzarlo (no es público ni HTTPS) y el registro falla con el error de HTTPS de arriba. Publica n8n en un dominio con HTTPS, por ejemplo detrás de un proxy inverso o con un túnel, y asegúrate de que la URL registrada sea la pública. Luego confirma con getWebhookInfo que url apunta a tu instancia.

Recuerda que, mientras ese flujo esté activo, cualquier script que llame a getUpdates con el mismo token recibirá 409. Si solo necesitas el chat id, sigue la guía cómo obtener el chat id.

Preguntas frecuentes

¿Puedo usar un webhook de Telegram en localhost o con HTTP?

No. La URL debe ser HTTPS y accesible desde internet en los puertos 443, 80, 88 u 8443. Para desarrollar en local usa getUpdates o expón tu servidor con un túnel HTTPS.

¿Cómo sé si mi bot tiene un webhook configurado?

Llama a getWebhookInfo: si url está vacía, no hay webhook. Si tiene valor, revisa pending_update_count y last_error_message para ver si las entregas fallan.

¿Para qué sirve secret_token en setWebhook?

Telegram lo envía en el encabezado X-Telegram-Bot-Api-Secret-Token de cada petición. Compáralo en tu servidor para rechazar las peticiones que no vienen de tu webhook.

¿Qué pasa si mi servidor responde con un error?

Si el código no es 2xx, Telegram reintenta la entrega y se rinde tras un número razonable de intentos. Mientras tanto, las actualizaciones se acumulan en pending_update_count.

¿Cómo elimino el webhook de mi bot?

Llama a deleteWebhook (con drop_pending_updates=true si quieres descartar lo pendiente) o a setWebhook con url vacía. Después podrás usar getUpdates otra vez.

¿Un bot puede tener varios webhooks?

No. Un bot tiene una sola URL de webhook y cada llamada a setWebhook reemplaza la anterior. Si necesitas varios destinos, recibe todo en un endpoint y reparte desde tu servidor.

Cómo crear un bot en Telegram paso a paso: de BotFather a tu primer mensaje

Aprende a crear un bot de Telegram: /newbot en @BotFather, token, prueba con getMe y tu primer mensaje con curl y Python. Gratis y sin servidor.

Cómo enviar mensajes con la API de Telegram: sendMessage paso a paso

Envía mensajes con la Bot API de Telegram: sendMessage con curl, Python y JavaScript, formato HTML y MarkdownV2, botones inline y errores 400, 403 y 429.

Cómo obtener el token de un bot de Telegram (y qué hacer si se filtra)

Cómo obtener el token de tu bot de Telegram con @BotFather, encontrarlo si el bot ya existe, comprobarlo con getMe y revocarlo si se filtró.

Cómo obtener el chat id de Telegram: usuarios, grupos, canales y temas

Obtén el chat id de Telegram para tu bot con getUpdates: usuarios, grupos, supergrupos (-100…), canales y temas, y qué hacer si result viene vacío.