Kirim Pesan Bot Telegram dengan Telegram Bot API (sendMessage)
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:
| Parameter | Keterangan |
|---|---|
chat_id | Wajib. Angka chat id atau @username channel/supergroup |
text | Wajib. 1–4096 karakter setelah entity diparsing |
parse_mode | HTML, MarkdownV2, atau Markdown (legacy) |
reply_markup | Tombol inline atau keyboard kustom |
disable_notification | Kirim tanpa suara notifikasi |
link_preview_options | Mengatur preview link |
message_thread_id | Topik tujuan di supergroup forum |
reply_parameters | Membalas 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 <, >, dan &.
{
"chat_id": 123456789,
"parse_mode": "HTML",
"text": "<b>Pesanan #123</b>\nTotal: <code>Rp150.000</code>\n<i>Belanja < Rp200.000 & 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"}
]]
}
}
- Tombol
urlmembuka link. Tombolcallback_datamengirimcallback_queryke bot. callback_datapanjangnya 1–64 byte, bukan karakter, jadi emoji dan huruf non-Latin lebih cepat habis.- Setiap tombol yang ditekan perlu dijawab dengan
answerCallbackQuery, kalau tidak indikator loading di tombol tidak hilang. - Jika memakai form-urlencoded atau query string,
reply_markupdikirim sebagai string JSON.
Kirim ke grup dan channel
- Grup:
chat_idberupa angka negatif; supergroup diawali-100. Bot harus menjadi anggota grup. - Channel: gunakan
@channelusernameuntuk channel publik, atau ID-100…untuk channel privat. Bot wajib menjadi admin dengan izin memposting. - Topik forum: tambahkan
message_thread_id.
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
| Error | Penyebab dan solusi |
|---|---|
400 Bad Request: chat not found | Chat id salah (tanda minus atau -100 hilang), pengguna belum menekan Start, atau bot belum masuk grup/channel. |
400 … can't parse entities | Format HTML/MarkdownV2 tidak valid. Escape karakter khusus. |
401 Unauthorized | Token salah atau sudah di-revoke. |
403 Forbidden: bot was blocked by the user | Pengguna memblokir bot. Hapus dari daftar broadcast. |
429 Too Many Requests | Terlalu 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.
Panduan terkait
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.