Telegram Bot API
🌐 Português

Como configurar o webhook do bot do Telegram: setWebhook, secret_token e n8n

· 7 min de leitura

Um webhook faz o Telegram enviar cada update do seu bot por HTTPS POST para uma URL sua, em vez de você ficar chamando getUpdates. Para configurar o webhook do Telegram bot, chame setWebhook com uma URL HTTPS pública (portas 443, 80, 88 ou 8443) e um secret_token, depois confira o status com getWebhookInfo. Este guia mostra os comandos, o código do handler e os erros mais comuns — inclusive no n8n.

Webhook ou getUpdates?

getUpdates (long polling)Webhook
Como funcionaSeu código busca os updatesO Telegram envia para a sua URL
Precisa de HTTPS públicoNãoSim
Bom paraDesenvolvimento, bots pequenosProdução, serverless, automações

Os dois modos são mutuamente exclusivos: enquanto houver webhook, getUpdates responde 409 Conflict. Em ambos os casos os updates pendentes ficam guardados por no máximo 24 horas.

Requisitos do webhook

Como configurar o webhook com setWebhook

Primeiro gere um segredo (a saída hexadecimal só usa caracteres permitidos):

openssl rand -hex 32

Depois registre a URL:

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

Resposta esperada: {"ok":true,"result":true,"description":"Webhook was set"}. O que cada parâmetro faz:

Prefere um formulário? Use o Bot API Tester no setWebhook e confira o resultado em getWebhookInfo.

Verificar com getWebhookInfo

curl "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/getWebhookInfo"
{
  "ok": true,
  "result": {
    "url": "https://bot.seudominio.com.br/telegram/webhook",
    "has_custom_certificate": false,
    "pending_update_count": 12,
    "last_error_date": 1793280000,
    "last_error_message": "Wrong response from the webhook: 404 Not Found",
    "max_connections": 40,
    "allowed_updates": ["message", "callback_query"]
  }
}

Se pending_update_count só cresce, o Telegram não está conseguindo entregar. O last_error_message diz o motivo (resposta HTTP do seu servidor, timeout, erro de SSL) e o last_error_date diz quando, em Unix time.

Validar o header X-Telegram-Bot-Api-Secret-Token

Qualquer pessoa pode fazer POST na sua URL; o header com o segredo prova que a requisição veio do webhook que você configurou. Exemplo com Flask:

import hmac
import os

from flask import Flask, abort, request

SECRET = os.environ["WEBHOOK_SECRET"]
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.encode(), SECRET.encode()):
        abort(403)
    update = request.get_json(silent=True) or {}
    msg = update.get("message")
    if msg and "text" in msg:
        # resposta direta: o Telegram executa este sendMessage
        return {"method": "sendMessage", "chat_id": msg["chat"]["id"], "text": "Recebido!"}
    return "", 200

Responda rápido com status 2xx. Qualquer outro status faz o Telegram repetir a entrega, e você recebe o mesmo update de novo — use o update_id para ignorar duplicados. Trabalho pesado (IA, banco, APIs externas) vai para uma fila. Responder com JSON contendo method economiza uma requisição, mas você não fica sabendo se ela deu certo; para isso, chame a API normalmente, como no guia enviar mensagens pela API do Telegram.

Remover o webhook e voltar ao getUpdates

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

Sem drop_pending_updates, os updates pendentes continuam na fila e chegam no próximo getUpdates.

Erros comuns

Começando do zero? Veja antes como criar um bot no Telegram.

Perguntas frequentes

Qual a diferença entre webhook e getUpdates?

Com getUpdates o seu código pergunta ao Telegram se há novidades (long polling). Com webhook, o Telegram envia cada update por HTTPS POST para a sua URL. Os dois não funcionam ao mesmo tempo no mesmo bot.

Posso usar webhook com localhost?

Não diretamente: a URL precisa ser HTTPS, pública e nas portas 443, 80, 88 ou 8443. Para desenvolver, use um túnel HTTPS ou continue com getUpdates.

Como remover o webhook do bot?

Chame deleteWebhook (opcionalmente com drop_pending_updates=true) ou setWebhook com url vazia. Depois disso o getUpdates volta a funcionar.

Para que serve o secret_token do webhook?

É um segredo de 1 a 256 caracteres (A-Z, a-z, 0-9, _ e -) que o Telegram envia no header X-Telegram-Bot-Api-Secret-Token em cada requisição. O seu servidor rejeita tudo o que chegar sem ele.

Por que o webhook do Telegram no n8n não funciona?

Na maioria das vezes a instância roda em localhost ou sem HTTPS válido, e o Telegram só entrega updates para URLs HTTPS públicas. Outra causa comum é outro script ou integração usar o mesmo token e trocar o webhook.

Como criar um bot no Telegram grátis: do BotFather à primeira mensagem

Aprenda a criar bot no Telegram grátis com o @BotFather: pegue o token, teste com getMe e envie a primeira mensagem com curl e Python.

Como enviar mensagens pela API do Telegram com sendMessage (curl, Python e JavaScript)

Use a API do Telegram para enviar mensagens com sendMessage: exemplos em curl, Python e JavaScript, HTML e MarkdownV2, botões inline e erros comuns.

Telegram bot token: como pegar o token do bot, verificar e revogar

Veja como pegar o token do bot do Telegram no @BotFather, achar o token de um bot existente, testar com getMe e revogar um token vazado.

Chat id do Telegram: como pegar o ID de usuário, grupo, canal e tópico com o seu bot

Descubra o chat id do Telegram para o seu bot: getUpdates em chat privado, grupos, supergrupos (-100), canais e tópicos, e o que fazer se vier vazio.