Telegram Bot API
🌐 Bahasa Indonesia

Kirim Pesan Bot Telegram dengan Telegram Bot API (sendMessage)

· 8 menit baca

Untuk kirim pesan bot telegram, panggil metode sendMessage di Telegram Bot API: kirim request ke https://api.telegram.org/bot<token>/sendMessage dengan dua parameter wajib, chat_id dan text. Berikut contoh siap pakai dengan curl, Python, dan JavaScript, ditambah format HTML/MarkdownV2, tombol inline, dan solusi error yang paling sering muncul.

Format request Telegram Bot API send message

Bot API menerima GET maupun POST. Parameter bisa dikirim lewat query string, application/x-www-form-urlencoded, application/json, atau multipart/form-data. Parameter yang paling sering dipakai:

ParameterKeterangan
chat_idWajib. Angka chat id atau @username channel/supergroup
textWajib. 1–4096 karakter setelah entity diparsing
parse_modeHTML, MarkdownV2, atau Markdown (legacy)
reply_markupTombol inline atau keyboard kustom
disable_notificationKirim tanpa suara notifikasi
link_preview_optionsMengatur preview link
message_thread_idTopik tujuan di supergroup forum
reply_parametersMembalas pesan tertentu

Respons sukses berisi "ok": true dan objek Message di result. Saat gagal, "ok": false disertai error_code dan description.

Contoh kirim pesan: curl, Python, JavaScript

curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{"chat_id": 123456789, "text": "Halo dari Bot API"}'
import os
import requests

TOKEN = os.environ["BOT_TOKEN"]
URL = f"https://api.telegram.org/bot{TOKEN}/sendMessage"

data = requests.post(URL, json={"chat_id": 123456789, "text": "Halo dari Python"}, timeout=10).json()
if not data["ok"]:
    print(data["error_code"], data["description"])
// Node.js 18+ (fetch bawaan), simpan sebagai file .mjs
const token = process.env.BOT_TOKEN;
const res = await fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ chat_id: 123456789, text: "Halo dari JavaScript" }),
});
console.log(await res.json());

Jalankan kode ini di backend, bukan di JavaScript browser, karena token akan terlihat oleh semua orang. Tips menyimpan token ada di panduan token bot Telegram.

Format teks dengan parse_mode HTML

Dengan "parse_mode": "HTML", tag yang didukung hanya: <b>/<strong>, <i>/<em>, <u>/<ins>, <s>/<strike>/<del>, <span class="tg-spoiler">/<tg-spoiler>, <a href="...">, <code>, <pre>, <pre><code class="language-python">, <blockquote>, dan <blockquote expandable>. Karakter <, >, dan & di luar tag wajib ditulis sebagai &lt;, &gt;, dan &amp;.

{
  "chat_id": 123456789,
  "parse_mode": "HTML",
  "text": "<b>Pesanan #123</b>\nTotal: <code>Rp150.000</code>\n<i>Belanja &lt; Rp200.000 &amp; ongkir gratis</i>"
}

Di Python, escape teks dari pengguna dengan html.escape(teks, quote=False) sebelum disisipkan ke template.

MarkdownV2: karakter yang wajib di-escape

Dengan "parse_mode": "MarkdownV2", karakter berikut wajib diawali \ jika bukan bagian dari format: _ * [ ] ( ) ~ ` > # + - = | { } . !. Karakter \ sendiri juga harus di-escape. Fungsi bantu di Python:

import re

def escape_md2(text: str) -> str:
    return re.sub(r"([_*\[\]()~`>#+\-=|{}.!\\])", r"\\\1", text)

text = "*" + escape_md2("Diskon 50%!") + "*\n" + escape_md2("Berlaku s.d. 31-12.")
# hasil: *Diskon 50%\!*  lalu  Berlaku s\.d\. 31\-12\.

Kalau ada karakter yang lupa di-escape, API membalas error 400 berisi can't parse entities.

Tombol inline lewat reply_markup

{
  "chat_id": 123456789,
  "text": "Pilih menu:",
  "reply_markup": {
    "inline_keyboard": [[
      {"text": "Buka situs", "url": "https://example.com"},
      {"text": "Konfirmasi", "callback_data": "confirm_123"}
    ]]
  }
}

Kirim ke grup dan channel

Cara mendapatkan semua ID ini dijelaskan di panduan chat id Telegram.

Pesan tanpa suara dan preview link

{
  "chat_id": 123456789,
  "text": "Laporan harian: https://example.com/report",
  "disable_notification": true,
  "protect_content": true,
  "link_preview_options": {"is_disabled": true}
}

disable_notification mengirim notifikasi tanpa suara. protect_content mencegah pesan diteruskan dan disimpan. Di link_preview_options, is_disabled mematikan preview. Sebaliknya, url, prefer_small_media, prefer_large_media, dan show_above_text mengatur tampilannya.

Error yang sering muncul

ErrorPenyebab dan solusi
400 Bad Request: chat not foundChat id salah (tanda minus atau -100 hilang), pengguna belum menekan Start, atau bot belum masuk grup/channel.
400 … can't parse entitiesFormat HTML/MarkdownV2 tidak valid. Escape karakter khusus.
401 UnauthorizedToken salah atau sudah di-revoke.
403 Forbidden: bot was blocked by the userPengguna memblokir bot. Hapus dari daftar broadcast.
429 Too Many RequestsTerlalu cepat. Tunggu parameters.retry_after detik lalu ulangi.

Batas yang disarankan Telegram: maksimal sekitar 1 pesan per detik ke satu chat, 20 pesan per menit ke satu grup, dan sekitar 30 pesan per detik untuk broadcast. Contoh menangani 429:

import time

def kirim(payload):
    while True:
        data = requests.post(URL, json=payload, timeout=10).json()
        if data.get("error_code") == 429:
            time.sleep(data["parameters"]["retry_after"])
            continue
        return data

Untuk membalas pesan pengguna secara real-time, gabungkan sendMessage dengan webhook Telegram bot.

Coba tanpa menulis kode

Buka sendMessage di Bot API Tester, tempel token, isi chat_id dan text, lalu tekan Ctrl+Enter. Respons JSON langsung tampil, jadi kamu bisa menguji parse_mode dan reply_markup sebelum menulis kode. Daftar lengkap parameter ada di referensi metode sendMessage (bahasa Inggris) dan dokumentasi resmi.

Pertanyaan umum

Bagaimana cara kirim pesan bot telegram ke diri sendiri?

Tekan Start di chat dengan bot, ambil chat id kamu dari getUpdates (message.chat.id), lalu panggil sendMessage dengan chat_id tersebut.

Berapa panjang maksimal pesan bot Telegram?

Parameter text menerima 1–4096 karakter setelah entity diparsing. Teks yang lebih panjang harus dipecah menjadi beberapa pesan.

Kenapa muncul error can't parse entities?

Formatnya tidak valid: ada karakter MarkdownV2 yang belum di-escape, atau tag HTML yang tidak ditutup atau tidak didukung. Escape karakter khusus, atau kirim tanpa parse_mode untuk mengecek.

Apakah bot bisa mengirim pesan ke pengguna yang belum pernah chat dengan bot?

Tidak. Bot tidak bisa memulai percakapan pribadi; pengguna harus menekan Start atau mengirim pesan ke bot terlebih dulu.

Bagaimana cara mengirim pesan tanpa suara notifikasi?

Tambahkan "disable_notification": true. Pengguna tetap menerima notifikasi, tetapi tanpa suara.

Pilih parse_mode HTML atau MarkdownV2?

Untuk teks dinamis, HTML biasanya lebih aman karena hanya <, >, dan & yang perlu di-escape. MarkdownV2 mewajibkan escape untuk banyak karakter, termasuk titik dan tanda minus.

Cara Membuat Bot Telegram: dari BotFather sampai Pesan Pertama

Cara membuat bot telegram langkah demi langkah: daftar di @BotFather, simpan token, cek dengan getMe, lalu kirim pesan pertama lewat curl dan Python.

Telegram Bot Token: Cara Mendapatkan, Mengecek, dan Mencabut Token

Cara mendapatkan token bot telegram dari @BotFather, melihat token bot lama, mengecek dengan getMe, dan me-revoke token yang bocor. Lengkap dengan contoh.

Webhook Telegram Bot: Cara Setting setWebhook, Secret Token, dan Mengatasi Error

Panduan webhook telegram bot: syarat HTTPS dan port, setWebhook dengan secret_token, cek getWebhookInfo, deleteWebhook, serta solusi error 409 dan n8n.

Chat ID Telegram Dimana? Cara Mendapatkan Chat ID User, Grup, dan Channel

Chat id telegram dimana? Cara mendapatkan chat id user, grup, supergroup, dan channel lewat getUpdates, plus solusi saat result kosong atau error 409.