Dokumentasi pengembang
Bahasa Indonesia

Pengembangan bot

Referensi Bot API

Semua metode yang diterima HTTP Bot API Pabal, objek yang dipertukarkan, dan error-nya, tanpa ada yang terlewat. Kompatibel dengan Bot API Telegram.

HTTP Bot API Pabal memakai format alamat, permintaan, respons, dan error yang sama dengan Bot API Telegram. Dokumen ini hanya mencantumkan apa yang benar-benar diterima Pabal. Metode yang tidak ada di sini mengembalikan 404 Not Found: method not found. Jika Anda baru mulai, bacalah tutorial membuat bot terlebih dahulu.

Mengirim permintaan

https://pabal.me/bot<token>/<metode>
  • Metode HTTP: GET maupun POST bisa dipakai.
  • Ada empat cara mengirim parameter — query string (?chat_id=1&text=hi), application/x-www-form-urlencoded, application/json, dan multipart/form-data saat mengunggah berkas. Boleh dicampur.
  • Parameter berupa objek (reply_markup, commands, allowed_updates) dimasukkan apa adanya sebagai objek atau array di badan JSON, dan sebagai string JSON di formulir atau query.
  • Nama metode tidak membedakan huruf besar dan kecil (sendMessage = sendmessage).
  • Ukuran badan hingga 12MB (jika lebih, 413).
  • Mengunduh berkas memakai alamat tersendiri, https://pabal.me/file/bot<token>/<file_path> (getFile).

Respons dan error

Respons selalu berupa JSON. Jika berhasil, Anda menerima HTTP 200 dan result; jika gagal, Anda menerima status HTTP tersebut, error_code yang sama dengan status itu, dan description yang bisa dibaca manusia.

{"ok": true, "result": { … }}
{"ok": false, "error_code": 400, "description": "Bad Request: chat not found"}
error_codeKapanContoh description
400Parameter salahBad Request: chat not found, Bad Request: message text is empty, Bad Request: message is not modified: …, Bad Request: message to edit not found, Bad Request: wrong file identifier/HTTP URL specified, Bad Request: query is too old and response timeout expired or query ID is invalid
401Token salahUnauthorized
403Tidak berhak mengirimForbidden: bot can't initiate conversation with a user, Forbidden: bot is not a member of the group chat
404Metode atau berkas tidak adaNot Found: method not found
409getUpdates dipanggil saat webhook terpasangConflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first
413Badan melebihi 12MBRequest Entity Too Large
500Error internal serverInternal Server Error

Pabal belum menerapkan pembatasan laju permintaan (429 Too Many Requests), tetapi karena bisa saja ditambahkan nanti, tulislah kode Anda agar saat menerima 429 ia menunggu selama parameters.retry_after detik lalu mengirim ulang.

Menerima update

Gunakan salah satu dari dua cara. Keduanya tidak bisa dipakai bersamaan.

getUpdates

POST/bot<token>/getUpdates

Mengambil update yang sedang menunggu (long polling). Jika webhook terpasang, hasilnya 409.

ParameterTipeWajibDeskripsi
offsetIntegerOpsionalHanya update dengan nomor ini atau lebih besar. Yang lebih kecil dihapus sebagai "sudah diterima". Berikan update_id + 1 terakhir yang sudah diproses.
limitIntegerOpsional1–100, bawaan 100
timeoutIntegerOpsionalDetik untuk menunggu, 0–50, bawaan 0. Disarankan 25–30.
allowed_updatesArray of StringDiabaikanDiterima tetapi tidak dipakai. Untuk menyaring jenis update, saring setelah diterima.

Mengembalikan: Array of Update

setWebhook

POST/bot<token>/setWebhook

Menerima update di alamat HTTPS. Penjelasan lengkapnya ada di dokumen Webhook.

ParameterTipeWajibDeskripsi
urlStringYaAlamat publik https://. String kosong menghapus webhook
secret_tokenStringOpsional1–256 karakter, A-Z a-z 0-9 _ -. Dikirim dalam header permintaan X-Telegram-Bot-Api-Secret-Token
allowed_updatesArray of StringOpsionalPilihan dari message, edited_message, callback_query. Jika kosong, semuanya
drop_pending_updatesBooleanOpsionalMembuang update yang sedang menunggu
max_connectionsIntegerOpsional1–100, bawaan 40. Hanya disimpan; pengiriman tetap satu per satu untuk setiap bot
certificateInputFileTidak didukung400 — gunakan sertifikat publik
ip_addressStringDiabaikan

Mengembalikan: True

deleteWebhook

POST/bot<token>/deleteWebhook

Menghapus webhook dan kembali ke getUpdates. Tetap berhasil meskipun tidak ada webhook.

ParameterTipeWajibDeskripsi
drop_pending_updatesBooleanOpsionalMembuang update yang sedang menunggu

Mengembalikan: True

getWebhookInfo

GET/bot<token>/getWebhookInfo

Status webhook. Tanpa parameter. Jika tidak ada webhook, url berupa string kosong.

Mengembalikan: WebhookInfo

Metode

MetodeFungsinya
getMeInformasi tentang bot itu sendiri
sendMessageMengirim teks (termasuk tombol)
sendPhotoMengirim foto
editMessageTextMengedit teks dan tombol pesan yang sudah dikirim
editMessageCaptionMengedit keterangan foto
editMessageReplyMarkupMengedit tombolnya saja
deleteMessageMenghapus pesan
answerCallbackQueryMenjawab penekanan tombol
sendChatActionIndikator "sedang mengetik" (hanya diterima)
getChatInformasi obrolan
getFileJalur unduhan foto yang diterima
setMyCommands · getMyCommands · deleteMyCommandsMenu perintah
logOut · closeUntuk kompatibilitas (tidak melakukan apa pun)
getUpdates · setWebhook · deleteWebhook · getWebhookInfoMenerima update (lihat di atas)
Yang bisa dimasukkan ke chat_id

Untuk obrolan 1:1, ID orang tersebut (bilangan positif); untuk grup biasa, ID grup (bilangan negatif); atau nama pengguna orang tersebut ("@hana_lee"). Semuanya bisa diketahui dari chat.id pada update. ID kanal atau supergrup (-100…) belum ada (400 chat not found).

getMe

GET/bot<token>/getMe

Dipakai untuk memeriksa apakah token benar. Tanpa parameter.

Mengembalikan: User — untuk bot, ditambah can_join_groups (true), can_read_all_group_messages (true), supports_inline_queries (false), can_connect_to_business (false), dan has_main_web_app (false).

sendMessage

POST/bot<token>/sendMessage

ParameterTipeWajibDeskripsi
chat_idInteger atau StringYaObrolan tujuan (lihat kotak di atas)
textStringYa1–4.096 karakter. Dikirim apa adanya
reply_markupInlineKeyboardMarkup · ReplyKeyboardMarkup · ReplyKeyboardRemove · ForceReplyOpsionalTombol
disable_notificationBooleanOpsionalKirim tanpa suara
parse_mode, entities, reply_parameters, link_preview_optionsDiabaikanDiterima tetapi tidak dipakai. Format tidak diterapkan

Mengembalikan: Message yang dikirim

Untuk mengirim ke seseorang, orang itu harus sudah lebih dulu mengirim pesan ke bot (403 Forbidden: bot can't initiate conversation with a user). Untuk mengirim ke grup, bot harus menjadi anggota grup itu.

sendPhoto

POST/bot<token>/sendPhoto

ParameterTipeWajibDeskripsi
chat_idInteger atau StringYaObrolan tujuan
photoInputFile atau StringYaBerkas yang diunggah dengan multipart/form-data (hingga 10MB, JPEG/PNG/GIF), atau file_id foto yang pernah diterima. URL belum didukung
captionStringOpsional0–1.024 karakter
reply_markupSama dengan sendMessageOpsional
disable_notificationBooleanOpsional

Mengembalikan: Message yang dikirim (dengan file_id baru di photo)

editMessageText

POST/bot<token>/editMessageText

ParameterTipeWajibDeskripsi
chat_idInteger atau StringYaObrolan tempat pesan itu berada
message_idIntegerYaPesan yang akan diedit (yang dikirim bot)
textStringYaTeks baru, 1–4.096 karakter
reply_markupInlineKeyboardMarkupOpsionalTombol baru. Jika dihilangkan, tombolnya ikut hilang (sama seperti Telegram)
inline_message_idStringTidak didukung400 karena mode inline tidak ada

Mengembalikan: Message yang sudah diedit. Perubahan langsung tampil di aplikasi, dan pesan yang diedit oleh manusia datang ke bot sebagai edited_message.

Jika teks dan tombol sama persis dengan sebelumnya, hasilnya 400 Bad Request: message is not modified: …; jika mencoba mengedit pesan milik orang lain, hasilnya 400 Bad Request: message can't be edited.

editMessageCaption

POST/bot<token>/editMessageCaption

Parameternya chat_id, message_id, caption (0–1.024 karakter; jika dihilangkan, keterangan dihapus), dan reply_markup. Mengembalikan: Message yang sudah diedit.

editMessageReplyMarkup

POST/bot<token>/editMessageReplyMarkup

Mengganti tombolnya saja, teks dibiarkan. Parameternya chat_id, message_id, dan reply_markup (jika dihilangkan, tombol dihapus). Mengembalikan: Message yang sudah diedit.

deleteMessage

POST/bot<token>/deleteMessage

Parameternya chat_id dan message_id. Menghapus pesan dari kedua sisi obrolan. Jika pesannya tidak ada, 400 Bad Request: message to delete not found. Mengembalikan: True.

answerCallbackQuery

POST/bot<token>/answerCallbackQuery

Menjawab tombol yang ditekan seseorang (CallbackQuery). Anda bisa menjawab dalam 10 detik dan hanya sekali.

ParameterTipeWajibDeskripsi
callback_query_idStringYacallback_query.id dari update
textStringOpsionalTeks yang muncul sebentar di atas layar
show_alertBooleanOpsionalJika true, ditampilkan dalam jendela dengan tombol OK
urlStringOpsionalAlamat yang akan dibuka aplikasi
cache_timeIntegerOpsionalBerapa detik aplikasi mengingat jawaban ini

Mengembalikan: True. Jika terlambat atau sudah dijawab, 400 Bad Request: query is too old and response timeout expired or query ID is invalid.

sendChatAction

POST/bot<token>/sendChatAction

Diterima demi kompatibilitas dan mengembalikan True, tetapi belum menampilkan "sedang mengetik…" di aplikasi.

getChat

GET/bot<token>/getChat?chat_id=…

Parameternya chat_id (angka). Untuk orang, orang tersebut; untuk grup, hanya grup yang anggotanya termasuk bot. Mengembalikan: Chat. Jika tidak ada atau tidak bisa dilihat, 400 Bad Request: chat not found.

getFile

GET/bot<token>/getFile?file_id=…

Mendapatkan jalur unduhan dari file_id foto yang diterima. Mengembalikan: File. Setelah itu, unduh dari alamat ini.

https://pabal.me/file/bot<token>/<file_path>

file_id juga merupakan hak untuk mengambil foto itu. Jika nilainya salah, 400 Bad Request: wrong file identifier/HTTP URL specified.

setMyCommands

POST/bot<token>/setMyCommands

ParameterTipeWajibDeskripsi
commandsArray of BotCommandYaMaksimal 100
language_codeStringOpsionalDisimpan sebagai daftar per bahasa. Saat ini aplikasi hanya menampilkan daftar bawaan tanpa kode bahasa
scopeBotCommandScopeDiabaikan

Mengembalikan: True. Jika tidak sesuai aturan perintah, 400 Bad Request: BOT_COMMAND_INVALID.

getMyCommands

GET/bot<token>/getMyCommands

Parameternya language_code (opsional). Mengembalikan: Array of BotCommand.

deleteMyCommands

POST/bot<token>/deleteMyCommands

Parameternya language_code (opsional). Mengosongkan daftar itu. Mengembalikan: True.

logOut · close

Di Telegram, metode ini dipakai saat pindah ke server Bot API lokal. Di Pabal tidak ada tempat untuk pindah, jadi metode ini hanya diterima dan mengembalikan True. Untuk membatalkan token, gunakan /revoke di BotFather.

Objek

Tanda opsional di samping kolom berarti kolom itu bisa saja tidak ada. Kolom Telegram lain yang tidak tercantum di sini tidak dikirim oleh Pabal.

Update

Satu update baru. Berisi update_id dan salah satu dari tiga kolom di bawah.

KolomTipeDeskripsi
update_idIntegerNomor yang bertambah 1. Dipakai untuk offset pada getUpdates
message opsionalMessagePesan baru untuk bot (obrolan 1:1, atau semua pesan di grup yang anggotanya termasuk bot)
edited_message opsionalMessagePesan yang diedit
callback_query opsionalCallbackQueryTombol inline ditekan

User

KolomTipeDeskripsi
idIntegerID pengguna (hanya bermakna di dalam server ini)
is_botBooleantrue jika bot
first_nameStringNama depan. Deleted Account jika akunnya sudah dihapus
last_name opsionalStringNama belakang
username opsionalStringNama pengguna (tanpa @)

Chat

KolomTipeDeskripsi
idIntegerUntuk orang, ID orang tersebut (bilangan positif); untuk grup biasa, bilangan negatif
typeStringprivate atau group
title opsionalStringNama grup (group)
first_name, last_name, username opsionalStringNama dan nama pengguna lawan bicara (private)

Message

KolomTipeDeskripsi
message_idIntegerNomor pesan di dalam obrolan ini
from opsionalUserPengirim
chatChatObrolan tempat pesan itu berada
dateIntegerWaktu dikirim (detik Unix)
edit_date opsionalIntegerWaktu terakhir diedit
text opsionalStringTeks (selalu ada jika bukan pesan foto)
entities opsionalArray of MessageEntityPerintah, sebutan, URL, dan tagar di dalam teks
photo opsionalArray of PhotoSizeFoto (di Pabal hanya satu, yaitu ukuran asli)
caption opsionalStringKeterangan foto
caption_entities opsionalArray of MessageEntityPerintah, sebutan, URL, dan tagar di dalam keterangan
reply_markup opsionalInlineKeyboardMarkupTombol inline yang terpasang pada pesan

MessageEntity

KolomTipeDeskripsi
typeStringbot_command, mention, url, hashtag
offsetIntegerPosisi awal (dalam unit kode UTF-16)
lengthIntegerPanjang (dalam unit kode UTF-16)

Server otomatis menemukannya di dalam teks dan menambahkannya. Entitas format seperti tebal dan miring belum ada.

PhotoSize

KolomTipeDeskripsi
file_idStringID untuk mengunduh (getFile) dan mengirim ulang (sendPhoto)
file_unique_idStringBernilai sama untuk foto yang sama, meskipun botnya berbeda. Tidak bisa dipakai untuk mengunduh
width, heightIntegerUkuran dalam piksel
file_sizeIntegerByte

File

KolomTipeDeskripsi
file_id, file_unique_idStringSama dengan PhotoSize
file_sizeIntegerByte
file_pathStringBerbentuk photos/<file_id>.jpg. Tempelkan di belakang /file/bot<token>/ untuk mengunduh

CallbackQuery

KolomTipeDeskripsi
idStringID yang diberikan ke answerCallbackQuery
fromUserOrang yang menekan tombol
message opsionalMessagePesan tempat tombol itu terpasang
chat_instanceStringNilai yang mewakili obrolan tersebut
data opsionalStringcallback_data tombol

InlineKeyboardMarkup

inline_keyboard: Array of Array of InlineKeyboardButton — array luar adalah baris, array dalam adalah tombol-tombol dalam satu baris. Maksimal 100 baris dan 100 tombol per pesan.

InlineKeyboardButton

KolomTipeDeskripsi
textStringTeks tombol
callback_data salah satuStringNilai yang dikirim ke bot saat ditekan, 1–64 byte
url salah satuStringAlamat yang dibuka saat ditekan

Jenis lain seperti switch_inline_query, web_app, login_url, dan pay belum ada (400).

ReplyKeyboardMarkup

KolomTipeDeskripsi
keyboardArray of Array of KeyboardButtonPapan tombol di bawah kolom input
resize_keyboard, one_time_keyboard, is_persistent, selective opsionalBooleanSesuaikan ukuran · sembunyikan setelah sekali pakai · selalu tampil · hanya untuk orang tertentu
input_field_placeholder opsionalStringTeks petunjuk di kolom input

KeyboardButton

Satu string, atau objek yang berisi text dan kolom opsional request_contact (kirim kontak saya) serta request_location (kirim lokasi saya), keduanya Boolean.

ReplyKeyboardRemove

{"remove_keyboard": true} — menyembunyikan papan tombol. selective opsional.

ForceReply

{"force_reply": true} — aplikasi membuka kolom input dalam keadaan membalas pesan ini. selective dan input_field_placeholder opsional.

BotCommand

KolomTipeDeskripsi
commandString1–32 karakter huruf Latin kecil, angka, dan garis bawah (tanpa /)
descriptionString1–256 karakter

WebhookInfo

KolomTipeDeskripsi
urlStringAlamat webhook; string kosong jika tidak ada
has_custom_certificateBooleanSelalu false
pending_update_countIntegerJumlah update yang menunggu dikirim
ip_address opsionalStringIP tujuan pengiriman terakhir
last_error_date opsionalIntegerWaktu kegagalan terakhir (detik Unix)
last_error_message opsionalStringAlasan kegagalan terakhir (daftar)
max_connections opsionalIntegerNilai yang diberikan ke setWebhook
allowed_updates opsionalArray of StringNilai yang diberikan ke setWebhook

Perbedaan dengan Bot API Telegram

  • Jenis update: hanya message, edited_message, dan callback_query. Postingan kanal, inline query, pembayaran, polling, perubahan anggota (my_chat_member), dan lainnya tidak ada.
  • Format: parse_mode dan entities diabaikan, dan teks dikirim apa adanya. Hanya perintah, sebutan, URL, dan tagar yang ditandai otomatis.
  • Jenis obrolan: hanya 1:1 dan grup biasa. Kanal, supergrup, dan topik forum tidak ada.
  • Media: hanya foto. Dokumen, video, suara, stiker, album, dan pengiriman lewat URL tidak ada.
  • Bot di grup: tidak ada mode privasi, jadi bot menerima semua pesan di grup.
  • Antrean: update yang belum diambil disimpan di memori, hingga 1.000 update terbaru per bot, dan hilang saat server dimulai ulang (Telegram menyimpannya 24 jam).
  • Webhook: dikirim satu per satu secara berurutan (max_connections hanya disimpan), sertifikat self-signed tidak diterima, dan tidak ada batasan port.
  • ID: ID pengguna, pesan, dan berkas hanya bermakna di dalam server ini. Karena tidak ada kanal dan supergrup, ID berbentuk -100… juga tidak ada.
  • Metode yang tidak ada: yang tidak tercantum di daftar di atas (forwardMessage, copyMessage, sendDocument, sendPoll, getChatMember, banChatMember, answerInlineQuery …) menghasilkan 404 Not Found: method not found.