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 untuk seluruh permintaan, tetapi metode suara punya batas per jam sehingga bisa menghasilkan 429 Too Many Requests: retry after N (Panggilan suara). 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 StringOpsionalJenis yang ingin diterima (Update). Jika kosong, semua jenis bawaan (message, edited_message, callback_query). Jenis suara hanya datang jika disebut namanya. Daftar yang diberikan tersimpan sebagai pengaturan bot dan juga dipakai pada panggilan berikutnya dan webhook (jika tidak diberikan, nilai sebelumnya tetap berlaku)

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, ketiganya. Jenis suara (voice_call, voice_call_tool_query, voice_call_transcript) hanya datang jika disebut namanya. Jika tidak diberikan, nilai sebelumnya tetap berlaku
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
sendDocumentMengirim berkas
sendLocationMengirim lokasi (termasuk lokasi langsung)
sendVenueMengirim tempat (lokasi dengan nama dan alamat)
sendContactMengirim kartu kontak
editMessageLiveLocation · stopMessageLiveLocationMemindahkan atau menghentikan lokasi langsung
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)
setVoiceCallSettings · getVoiceCallSettings · endVoiceCall · sendVoiceCallContext · getVoiceCallUsage · startVoiceCall · answerVoiceCallToolQuery · setVoiceCallApiKey · setVoiceCallMcpServer …Bot suara (lihat Panggilan suara di bawah)
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_options …DiabaikanDiterima 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)

sendDocument

POST/bot<token>/sendDocument

ParameterTipeWajibDeskripsi
chat_idInteger atau StringYaObrolan tujuan
documentInputFile atau StringYaBerkas yang diunggah dengan multipart/form-data (tanpa batasan format, hingga 20MB), atau file_id berkas yang pernah diterima. URL belum didukung
filenameStringOpsionalNama yang tampil di sisi penerima. Jika kosong, nama berkas yang diunggah yang dipakai
captionStringOpsional0–1.024 karakter
reply_markupSama dengan sendMessageOpsional
disable_notificationBooleanOpsional
thumbnail, disable_content_type_detectionDiabaikanDiterima, tetapi tidak dipakai

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

Format (mime_type) ditentukan dari ekstensi nama berkas. Berkas yang dikirim dari sisi aplikasi bisa sampai 2GB, tetapi unggahan dan unduhan bot lewat HTTP dibatasi 20MB, sama seperti di Telegram.

sendLocation

POST/bot<token>/sendLocation

ParameterTipeWajibDeskripsi
chat_idInteger atau StringYaObrolan tujuan
latitude, longitudeFloatYaLintang (−90 sampai 90) dan bujur (−180 sampai 180). Jika di luar rentang, hasilnya 400 Bad Request: GEO_POINT_INVALID
horizontal_accuracyFloatOpsionalRadius ketidakpastian dalam meter, 0–1.500. Dibulatkan menjadi bilangan bulat saat disimpan
live_periodIntegerOpsionalMenjadikannya lokasi langsung: 60–86.400 detik, atau 2147483647 (0x7FFFFFFF) sampai dihentikan. Nilai lain menghasilkan 400 Bad Request: wrong live_period
headingIntegerOpsionalArah gerak lokasi langsung, 1–360 derajat
proximity_alert_radiusIntegerOpsionalRadius peringatan kedekatan lokasi langsung, dalam meter. Disimpan dan ditampilkan, tetapi peringatannya belum dikirim
reply_markupSama dengan sendMessageOpsional
disable_notificationBooleanOpsional

Mengembalikan: Message yang dikirim (dengan Location di location)

sendVenue

POST/bot<token>/sendVenue

ParameterTipeWajibDeskripsi
chat_idInteger atau StringYaObrolan tujuan
latitude, longitudeFloatYaLetak tempat itu (sama seperti sendLocation)
titleStringYaNama tempat
addressStringYaAlamat
foursquare_id, foursquare_typeStringOpsionalID dan jenis tempat di Foursquare, diteruskan apa adanya
google_place_id, google_place_typeStringOpsionalID dan jenis tempat di Google. Hanya dipakai jika tidak ada foursquare_id
reply_markupSama dengan sendMessageOpsional
disable_notificationBooleanOpsional

Mengembalikan: Message yang dikirim (dengan Venue di venue, dan titik yang sama di location)

Tanpa title atau address, hasilnya 400 Bad Request: title and address are required.

sendContact

POST/bot<token>/sendContact

ParameterTipeWajibDeskripsi
chat_idInteger atau StringYaObrolan tujuan
phone_numberStringYaNomor telepon, diteruskan sesuai yang ditulis
first_nameStringYaNama depan
last_nameStringOpsionalNama belakang
vcardStringOpsionalInformasi tambahan dalam format vCard, hingga 64KB
reply_markupSama dengan sendMessageOpsional
disable_notificationBooleanOpsional

Mengembalikan: Message yang dikirim (dengan Contact di contact)

Kartu kontak yang dikirim bot tidak pernah membawa user_id, bahkan jika nomornya milik akun Pabal — bot tidak punya kontak, dan jika kolom itu diisi, bot bisa mengetahui milik siapa sebuah nomor dengan mengirim satu kartu untuk tiap nomor. Tanpa phone_number atau first_name, hasilnya 400 Bad Request: phone_number and first_name are required.

editMessageLiveLocation

POST/bot<token>/editMessageLiveLocation

ParameterTipeWajibDeskripsi
chat_idInteger atau StringYaObrolan tempat pesan itu berada
message_idIntegerYaLokasi langsung yang akan dipindahkan (yang dikirim bot)
latitude, longitudeFloatYaPosisi baru
horizontal_accuracyFloatOpsionalRadius ketidakpastian dalam meter, 0–1.500
headingIntegerOpsionalArah gerak, 1–360 derajat
proximity_alert_radiusIntegerOpsionalRadius peringatan kedekatan dalam meter. 0 berarti dimatikan
live_periodIntegerOpsionalPeriode berbagi yang baru, dalam detik yang dihitung sejak pesan dikirim. Tidak bisa diperpanjang lebih dari satu hari dari periode sekarang; 2147483647 berarti sampai dihentikan
reply_markupInlineKeyboardMarkupOpsionalTombol baru
inline_message_idStringTidak didukung400 karena mode inline tidak ada

Mengembalikan: Message yang sudah diedit

Lokasi langsung yang sudah berakhir — dihentikan, atau periodenya habis — tidak bisa dipindahkan, juga tidak bisa dihidupkan lagi dengan memperpanjang periodenya (400 Bad Request: message can't be edited). Begitu pula pesan yang bukan lokasi langsung.

Perpindahan yang terjadi kurang dari 10 detik setelah perpindahan terakhir yang diterapkan, atau yang kurang dari 10 m, dilewati tanpa disimpan. Penghentian serta perubahan periode atau radius peringatan selalu diterapkan. Jika sebuah perpindahan dilewati, Message yang dikembalikan menunjukkan posisi terakhir yang diterapkan, jadi tidak masalah mengirim posisi setiap beberapa detik.

stopMessageLiveLocation

POST/bot<token>/stopMessageLiveLocation

Parameternya chat_id, message_id, dan reply_markup (opsional). Menghentikan lokasi langsung di posisi terakhirnya. Periode berbaginya dipendekkan menjadi waktu yang benar-benar berlalu, sehingga semua aplikasi menampilkannya sebagai sudah berakhir. Jika sudah dihentikan atau berakhir, hasilnya 400 Bad Request: message is not modified: …. Mengembalikan: Message yang sudah diedit.

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 tempat bot menjadi anggota. 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 sekaligus berfungsi sebagai izin 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 menu tidak sesuai aturan, tidak ada yang disimpan: 400 Bad Request: BOT_COMMAND_INVALID (perintah), BOT_COMMAND_DESCRIPTION_INVALID (deskripsi kosong atau lebih dari 256 karakter), BOT_COMMANDS_TOO_MUCH (lebih dari 100).

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 menonaktifkan 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 kolom di bawah.

KolomTipeDeskripsi
update_idIntegerNomor yang bertambah 1 setiap kali. Dipakai untuk offset pada getUpdates
message opsionalMessagePesan baru untuk bot (obrolan 1:1, atau semua pesan di grup tempat bot menjadi anggota)
edited_message opsionalMessagePesan yang diedit
callback_query opsionalCallbackQueryTombol inline ditekan
voice_call opsionalVoiceCallMulai dan berakhirnya panggilan ke bot suara atau panggilan yang dibuatnya (hanya datang jika diminta dengan namanya)
voice_call_tool_query opsionalVoiceCallToolQueryTool bot yang dipanggil model selama panggilan (hanya datang jika diminta dengan namanya)
voice_call_transcript opsionalVoiceCallTranscriptSatu giliran transkrip selama panggilan (hanya datang jika diminta dengan namanya)

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, berkas, lokasi, tempat, atau kontak)
entities opsionalArray of MessageEntityPerintah, sebutan, URL, dan tagar di dalam teks
photo opsionalArray of PhotoSizeFoto (di Pabal hanya satu, yaitu ukuran asli)
document opsionalDocumentBerkas
location opsionalLocationLokasi atau lokasi langsung. Pesan tempat juga membawa lokasinya di sini
venue opsionalVenueTempat
contact opsionalContactKartu kontak
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

Document

KolomTipeDeskripsi
file_idStringID untuk mengunduh (getFile) dan mengirim ulang (sendDocument)
file_unique_idStringBernilai sama untuk berkas yang sama, meskipun botnya berbeda. Tidak bisa dipakai untuk mengunduh
file_nameStringNama yang diberikan pengirim
mime_typeStringFormat yang disebutkan pengirim
file_sizeIntegerByte

Location

KolomTipeDeskripsi
latitude, longitudeFloatLintang dan bujur
horizontal_accuracy opsionalFloatRadius ketidakpastian dalam meter
live_period opsionalIntegerPeriode berbagi lokasi langsung, dalam detik yang dihitung sejak pesan dikirim. Setelah dihentikan, periodenya dipendekkan menjadi waktu yang benar-benar berlalu
heading opsionalIntegerArah gerak, 1–360 derajat
proximity_alert_radius opsionalIntegerRadius peringatan kedekatan dalam meter

Lokasi langsung yang dibagikan seseorang datang lagi sebagai edited_message setiap kali server menerapkan sebuah perpindahan.

Venue

KolomTipeDeskripsi
locationLocationLetak tempat itu
titleStringNama tempat
addressStringAlamat
foursquare_id, foursquare_type opsionalStringID dan jenis tempat di Foursquare
google_place_id, google_place_type opsionalStringID dan jenis tempat di Google

Contact

KolomTipeDeskripsi
phone_numberStringNomornya, persis seperti yang ditulis pengirim
first_nameStringNama depan
last_name opsionalStringNama belakang
user_id opsionalIntegerAkun Pabal dengan nomor itu. Hanya ada jika pengirim sudah menyimpan orang itu di kontaknya, atau jika itu dirinya sendiri
vcard opsionalStringInformasi tambahan dalam format vCard

File

KolomTipeDeskripsi
file_id, file_unique_idStringSama dengan PhotoSize
file_sizeIntegerByte
file_pathStringBerbentuk photos/<file_id>.jpg atau documents/<file_id>. 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

Panggilan suara

Metode-metode ini hanya ada di Pabal. Bot suara adalah bot yang bisa ditelepon dari aplikasi dan panggilannya dijawab oleh model suara AI; dengan metode ini Anda mengatur model itu dan menangani panggilan. Apa saja yang harus menyala, cara menyalakannya, dan contohnya ada di panduan Bot suara. Metodenya tetap ada di server yang fitur suaranya mati sehingga pengaturan bisa dibaca, tetapi bot yang suaranya mati atau belum diizinkan operator tidak bisa mengubah pengaturan selain untuk mematikan dan menghapus (403 VOICE_NOT_AVAILABLE).

setVoiceCallSettings

POST/bot<token>/setVoiceCallSettings

Mengubah pengaturan suara bot. Hanya yang dikirim yang berubah; server memeriksa semuanya lalu menulisnya sekaligus, atau menolak semuanya. 30 kali per jam per bot (termasuk lewat @BotFather).

ParameterTipeWajibDeskripsi
enabledBooleanOpsionalMenyalakan hanya bisa setelah aturan bot suara disetujui di @BotFather (403 VOICE_RULES_NOT_ACCEPTED). Mematikan selalu bisa
instructionsStringOpsionalInstruksi model, hingga 8.192 byte. "" menghapusnya (tidak bisa untuk bot terkelola yang menyala)
greetingStringOpsionalSalam pembuka, hingga 512 byte. Jika "", model menyapa dengan sendirinya
voiceStringOpsionalID suara, bawaan kore (daftar)
languageStringOpsionalko-KR (bawaan) · en-US · ja-JP · cmn-CN · fr-FR · es-US · id-ID · vi-VN · ar-EG (daftar). Huruf besar dan kecil tidak dibedakan, dan zh-CN disimpan sebagai cmn-CN. Bot yang bahasanya bukan bahasa Korea atau Inggris baru menerima telepon setelah operator membaca instruksi dan salam pembukanya lalu mengizinkannya
max_call_durationIntegerOpsionalDetik, 60 sampai limits.max_call_duration
max_concurrent_callsIntegerOpsional1 sampai limits.max_concurrent_calls
toolsArray of VoiceCallToolOpsionalTool bot yang bisa dipanggil model selama panggilan: {"name", "description", "parameters"?, "timeout_ms"?}. Aturannya di Mendefinisikan tool. Di formulir, berupa string JSON
transcriptBooleanOpsionalSakelar transkrip. Menyalakannya hanya bisa setelah ketentuan pemilik bot disetujui
modeStringOpsionalmanaged (model AI Pabal) atau stream (mode stream)
stream_url, stream_secretStringOpsionalBersama mode=stream. Rahasia hanya di badan permintaan

Mengembalikan: True

getVoiceCallSettings

GET/bot<token>/getVoiceCallSettings

Tanpa parameter. Pengaturan saat ini; apakah bot bisa menerima telepon sekarang (available, unavailable_reason); batas server; daftar suara dan bahasa; ke mana kueri tool dan transkrip akan dikirim; serta status kunci sendiri, mode stream, dan server MCP. Kunci dan rahasia tidak ditampilkan, hanya sidik jarinya. Penjelasan kolomnya ada di Bot suara — Melihat pengaturan saat ini.

Mengembalikan: VoiceCallSettings (objek)

endVoiceCall

POST/bot<token>/endVoiceCall

ParameterTipeWajibDeskripsi
voice_call_idStringYavoice_call.id
farewellBooleanOpsionalBawaan true: model mengucapkan salam perpisahan singkat lalu menutup (jika belum tertutup dalam 10 detik, server yang mengakhiri). Jika false, langsung ditutup

Mengembalikan: True. Jika bukan panggilan aktif milik bot ini: 400 VOICE_CALL_NOT_FOUND.

sendVoiceCallContext

POST/bot<token>/sendVoiceCallContext

ParameterTipeWajibDeskripsi
voice_call_idStringYaPanggilan yang sedang tersambung
textStringYaCatatan pemilik bot untuk model. Hingga 2.000 karakter dan 6.144 byte, diperiksa dengan aturan konten
respondBooleanOpsionalBawaan false. Jika true, model langsung bereaksi

Mengembalikan: True. Sebelum tersambung: VOICE_CALL_NOT_ACTIVE; panggilan mode stream: VOICE_CONTEXT_NOT_SUPPORTED; terlalu panjang: VOICE_CONTEXT_TOO_LONG; lebih dari 10 per menit per panggilan: 429.

getVoiceCallUsage

GET/bot<token>/getVoiceCallUsage

ParameterTipeWajibDeskripsi
periodStringOpsionaltoday (bawaan) atau month
monthStringOpsionalYYYY-MM, hanya bersama period=month

Mengembalikan: period, from_date, to_date, calls, seconds, missed, refused (busy·budget·unavailable), platform_seconds, own_key_seconds, remaining_seconds_today (bot·owner), serta outbound (today·limits) untuk bot yang pernah menyalakan panggilan — batas tanggal mengikuti zona waktu server

startVoiceCall

POST/bot<token>/startVoiceCall

Bot menelepon seseorang. Hanya bot yang dinyalakan pemiliknya di @BotFather dan sudah ditinjau operator yang bisa menelepon, dan hanya kepada orang yang mengizinkan bot itu. Jawaban dan cara permintaan dinilai ada di Bot suara — Menelepon.

ParameterTipeWajibKeterangan
user_idIntegerYaOrang yang akan ditelepon
purposeStringYaYang dipilih bot dari reminder, wake_up, delivery, appointment
contextStringYaYang hanya diketahui model, sampai 1.000 karakter dan 3.072 byte, diperiksa dengan aturan konten
max_durationIntegeropsionalLama maksimum setelah dijawab, dalam detik, 30–300 (sampai batas bot). Bawaan 180
ring_timeoutIntegeropsionalDetik berdering, 30–45. Bawaan 40

Mengembalikan: {"voice_call_id": "…"} — hanya berarti permintaan diterima; apakah berdering dan dijawab datang lewat update voice_call. Penolakan: 403 VOICE_OUTBOUND_OFF: <alasan>, 403 USER_UNAVAILABLE (isinya selalu sama), 429, 503 VOICE_UNAVAILABLE. Tidak bisa dipanggil dari jawaban webhook.

answerVoiceCallToolQuery

POST/bot<token>/answerVoiceCallToolQuery

ParameterTipeWajibDeskripsi
tool_query_idStringYaid dari VoiceCallToolQuery
resultString · Object · ArraySalah satuHasil tool, hingga 16.384 byte
errorStringSalah satuPesan kegagalan bot, hingga 512 byte

Mengembalikan: True. Jawaban pertama bersifat final. Jika terlambat: 400 TOOL_QUERY_EXPIRED: answered|timeout|cancelled|call_ended|unreachable; ID tidak dikenal: TOOL_QUERY_ID_INVALID; jawaban ditolak: TOOL_RESULT_EMPTY·TOOL_RESULT_INVALID·TOOL_RESULT_TOO_LONG·TOOL_ERROR_TOO_LONG·TOOL_RESULT_REFUSED: <kode>. POST kueri tool dari webhook juga bisa dijawab lewat badan respons.

setVoiceCallApiKey · deleteVoiceCallApiKey

POST/bot<token>/setVoiceCallApiKey

ParameterTipeWajibDeskripsi
providerStringYagoogle (kunci JSON akun layanan Vertex AI) atau openai (sk-…)
api_keyStringYaKuncinya. Hanya di badan permintaan (jika di query: 400), hingga 8 KiB

Mengembalikan: True — kunci baru disimpan setelah lolos sesi uji gateway. API_KEY_INVALID, API_KEY_NO_REALTIME_ACCESS, 503 API_KEY_CHECK_UNAVAILABLE (tidak disimpan), 403 VOICE_OWN_KEY_NOT_AVAILABLE (server ini tidak menerima kunci sendiri). deleteVoiceCallApiKey tanpa parameter dan selalu mengembalikan True. Kedua metode tidak bisa dipanggil lewat bots.sendCustomRequest, dan setVoiceCallApiKey juga tidak bisa dipanggil lewat respons webhook. Detailnya di Kunci model sendiri.

Metode server MCP

MetodeParameterMengembalikan
setVoiceCallMcpServerlabel, url, auth (objek), opsional audience, allowed_tools, requested_level, timeout_ms, tools (klasifikasi tambahan dari pemilik), declaration, auto_repinHasil pendaftaran (status, job_id). Jika penerimanya berubah: 400 MCP_CHANGE_NEEDS_CONFIRMATION, lalu konfirmasi di @BotFather
refreshVoiceCallMcpServerlabelPemeriksaan ulang (refreshing: true, job_id)
deleteVoiceCallMcpServerlabelTrue — tetap bisa meskipun MCP mati
getVoiceCallMcpBindingTidak adaiss, sub (bot:<id>), issuer_document, jwks_uri, audiences
createVoiceCallMcpClientKeylabeljwk publik dan thumbprint (kunci privat tidak pernah keluar dari Pabal)

auth dan rahasia hanya dikirim di badan permintaan. Di server yang MCP-nya mati: 403 VOICE_NOT_AVAILABLE: MCP tools are not available on this server. Detailnya di Bot suara — Server MCP.

Menerima update suara

voice_call, voice_call_tool_query, dan voice_call_transcript hanya datang jika diminta dengan menyebut namanya — tulis di allowed_updates milik getUpdates atau setWebhook. Dengan daftar kosong tidak datang, dan yang terjadi sebelum diminta tidak ditumpuk. Kueri tool datang lewat POST terpisah jika ada webhook, atau di urutan paling depan getUpdates berikutnya jika getUpdates dipanggil dalam 15 detik terakhir.

VoiceCall

KolomTipeDeskripsi
idStringID panggilan (desimal tak bertanda)
directionStringincoming (panggilan ke bot) atau outgoing (panggilan yang dibuat bot). Selalu ada
eventStringstarted, ended, missed, refused; untuk panggilan yang dibuat bot, started, ended, not_answered, failed
from opsionalUserKhusus panggilan ke bot — penelepon: id, is_bot, first_name, last_name, language_code. Tanpa nama pengguna dan nomor telepon
to opsionalObjectKhusus panggilan yang dibuat bot — {"id": …}, hanya id penerima panggilan
purpose opsionalStringKhusus panggilan yang dibuat bot — tujuan permintaan
dateIntegerWaktu kejadian (detik Unix). started: untuk panggilan dari aplikasi, saat pertukaran kunci selesai; untuk panggilan dari Apple Watch, saat audio jam tangan tersambung. ended datang paling lambat 10 detik kemudian di server yang menunggu transkrip atau menyalakan Simpan percakapan. Untuk panggilan yang dibuat bot, ended dari panggilan yang dijawab selalu datang paling lambat 10 detik kemudian, apa pun pengaturan server, karena server menunggu penggunaan dari gateway
max_duration opsionalIntegerDurasi maksimum panggilan ini (detik) — started, ended
start_date, duration opsionalIntegerWaktu tersambung dan lama tersambung dalam detik (jam server) — ended
end_reason opsionalStringcaller (callee untuk panggilan yang dibuat bot), bot, max_length, failed, operator, suspended — ended, missed
refused_reason opsionalStringbusy, budget, unavailable — refused
transcript opsionalObject{"turns": [{"role", "text", "offset_ms"}], "truncated"} — ended, jika transkrip menyala. Tidak pernah ada pada panggilan yang dibuat bot

VoiceCall tidak punya field yang menunjukkan apakah penelepon memilih Simpan percakapan. Ini disengaja — teks itu milik penelepon dan tidak dikirim ke bot. Karena itu, di server yang menyalakan Simpan percakapan, ended untuk semua panggilan yang bukan mode stream menunggu dengan lama yang sama, dan nomor pesan berikutnya setelah catatan panggilan selalu setidaknya 31 lebih besar daripada nomor catatan itu di semua panggilan (nomornya dipesan lebih dulu).

VoiceCallToolQuery

KolomTipeDeskripsi
idStringID yang diberikan ke answerVoiceCallToolQuery
voice_call_idStringID panggilan
fromUserPenelepon (kolom yang sama dengan VoiceCall)
nameStringNama tool
argumentsStringArgumen, berupa teks objek JSON (sudah diperiksa server)
budget_msIntegerMilidetik sejak diterima sampai jawaban harus tiba di server

VoiceCallTranscript

KolomTipeDeskripsi
voice_call_idStringID panggilan
seqIntegerNomor giliran
roleStringcaller atau bot
textStringTeks yang ditulis AI. Jika berisi nomor kartu atau nomor identitas kependudukan, angkanya diganti *
is_finalBooleanSelalu true
offset_ms, dateIntegerMilidetik sejak audio panggilan dimulai, dan waktunya

Hanya datang lewat HTTP Bot API. Transkrip lengkap panggilan ada di transcript pada voice_call yang sudah berakhir.

Mode stream (mode=stream)

Dalam mode stream, audio panggilan dikirim ke server milik pemilik bot, bukan ke model AI Pabal. Jika Anda mengirim mode=stream, stream_url=wss://…, dan stream_secret=… (32–128 karakter ASCII yang dapat dicetak, hanya di badan permintaan) ke setVoiceCallSettings, gateway Pabal mencoba tersambung sekali ke alamat itu (probe), dan jika berhasil, mode ini menyala. Diperlukan ketentuan pemilik bot dan build aplikasi yang memuat layar konfirmasi mode stream. Pengaturan, hasil probe, dan contohnya ada di Bot suara — Mode stream.

  • Koneksi: TLS 1.2 ke atas, sertifikat publik yang cocok dengan nama di URL, subprotokol pabal.voice.v1, tanpa kompresi, paling besar 64 KiB per pesan dan 4 KiB per teks, tanpa pengalihan.
  • Tanda tangan: X-Pabal-Voice-Signature: t=…,nonce=…,call=…,v1=HMAC-SHA256(stream_secret, "pabal-voice-stream/1\n<t>\n<nonce>\n<call>\n<host>\n<path?query>"). host adalah host URL yang Anda berikan. Periksa 300 detik, nonce sekali pakai, perbandingan byte demi byte, dan apakah start.call_id sama dengan call (selengkapnya).
  • Audio: pesan teks adalah event JSON, biner adalah PCM16 little-endian, mono, 24 kHz. Suara penelepon datang dalam potongan 20 ms (960 byte).
  • Pabal → bot: start (sekali) · live (pengumuman AI selesai) · audio · mark · cleared · buffer_full · stop (→ tutup 1000).
  • Bot → Pabal: ready (dalam 3 detik setelah start, paling pertama) · audio (setelah live) · clear · mark · hangup.

Bentuk setiap pesan ada di tabel Bot suara — Spesifikasi.

Error metode suara

Kode error metode suara dan artinya dikumpulkan di Bot suara — Error. 403 berbentuk Forbidden: <kode>: <keterangan> (VOICE_RULES_NOT_ACCEPTED, VOICE_NOT_AVAILABLE, VOICE_SUSPENDED, VOICE_OWNER_TERMS_NOT_ACCEPTED, VOICE_OWN_KEY_NOT_AVAILABLE, VOICE_STREAM_NOT_AVAILABLE, VOICE_OUTBOUND_OFF); USER_UNAVAILABLE selalu persis Forbidden: USER_UNAVAILABLE tanpa keterangan, dan jika batas per jam terlampaui, hasilnya 429 dengan retry_after.

Perbedaan dengan Bot API Telegram

  • Jenis update: hanya message, edited_message, callback_query, dan jenis bot suara yang khusus ada di Pabal (voice_call, voice_call_tool_query, voice_call_transcript). Postingan kanal, inline query, pembayaran, jajak pendapat, 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, berkas (sendDocument), lokasi, lokasi langsung, tempat, dan kontak. Pesan yang diputar sebagai video atau suara, stiker, album (sendMediaGroup), jajak pendapat, dan pengiriman lewat URL tidak ada. Unggahan dan unduhan lewat HTTP dibatasi 20MB.
  • Lokasi: peringatan kedekatan lokasi langsung (proximity_alert_radius) hanya disimpan, tidak pernah dikirim. Perpindahan dalam 10 detik atau 10 m dilewati tanpa diterapkan, dan kartu kontak yang dikirim bot tidak membawa user_id.
  • 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, sendVideo, sendPoll, getChatMember, banChatMember, answerInlineQuery …) menghasilkan 404 Not Found: method not found.