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:
GETmaupunPOSTbisa dipakai. - Ada empat cara mengirim parameter — query string (
?chat_id=1&text=hi),application/x-www-form-urlencoded,application/json, danmultipart/form-datasaat 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_code | Kapan | Contoh description |
|---|---|---|
400 | Parameter salah | Bad 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 |
401 | Token salah | Unauthorized |
403 | Tidak berhak mengirim | Forbidden: bot can't initiate conversation with a user, Forbidden: bot is not a member of the group chat |
404 | Metode atau berkas tidak ada | Not Found: method not found |
409 | getUpdates dipanggil saat webhook terpasang | Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first |
413 | Badan melebihi 12MB | Request Entity Too Large |
500 | Error internal server | Internal 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.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
offset | Integer | Opsional | Hanya update dengan nomor ini atau lebih besar. Yang lebih kecil dihapus sebagai "sudah diterima". Berikan update_id + 1 terakhir yang sudah diproses. |
limit | Integer | Opsional | 1–100, bawaan 100 |
timeout | Integer | Opsional | Detik untuk menunggu, 0–50, bawaan 0. Disarankan 25–30. |
allowed_updates | Array of String | Opsional | Jenis 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.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
url | String | Ya | Alamat publik https://. String kosong menghapus webhook |
secret_token | String | Opsional | 1–256 karakter, A-Z a-z 0-9 _ -. Dikirim dalam header permintaan X-Telegram-Bot-Api-Secret-Token |
allowed_updates | Array of String | Opsional | Pilihan 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_updates | Boolean | Opsional | Membuang update yang sedang menunggu |
max_connections | Integer | Opsional | 1–100, bawaan 40. Hanya disimpan; pengiriman tetap satu per satu untuk setiap bot |
certificate | InputFile | Tidak didukung | 400 — gunakan sertifikat publik |
ip_address | String | Diabaikan |
Mengembalikan: True
deleteWebhook
POST/bot<token>/deleteWebhook
Menghapus webhook dan kembali ke getUpdates. Tetap berhasil meskipun tidak ada webhook.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
drop_pending_updates | Boolean | Opsional | Membuang 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
| Metode | Fungsinya |
|---|---|
getMe | Informasi tentang bot itu sendiri |
sendMessage | Mengirim teks (termasuk tombol) |
sendPhoto | Mengirim foto |
sendDocument | Mengirim berkas |
sendLocation | Mengirim lokasi (termasuk lokasi langsung) |
sendVenue | Mengirim tempat (lokasi dengan nama dan alamat) |
sendContact | Mengirim kartu kontak |
editMessageLiveLocation · stopMessageLiveLocation | Memindahkan atau menghentikan lokasi langsung |
editMessageText | Mengedit teks dan tombol pesan yang sudah dikirim |
editMessageCaption | Mengedit keterangan foto |
editMessageReplyMarkup | Mengedit tombolnya saja |
deleteMessage | Menghapus pesan |
answerCallbackQuery | Menjawab penekanan tombol |
sendChatAction | Indikator "sedang mengetik" (hanya diterima) |
getChat | Informasi obrolan |
getFile | Jalur unduhan foto yang diterima |
setMyCommands · getMyCommands · deleteMyCommands | Menu perintah |
logOut · close | Untuk kompatibilitas (tidak melakukan apa pun) |
getUpdates · setWebhook · deleteWebhook · getWebhookInfo | Menerima update (lihat di atas) |
setVoiceCallSettings · getVoiceCallSettings · endVoiceCall · sendVoiceCallContext · getVoiceCallUsage · startVoiceCall · answerVoiceCallToolQuery · setVoiceCallApiKey · setVoiceCallMcpServer … | Bot suara (lihat Panggilan suara di bawah) |
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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tujuan (lihat kotak di atas) |
text | String | Ya | 1–4.096 karakter. Dikirim apa adanya |
reply_markup | InlineKeyboardMarkup · ReplyKeyboardMarkup · ReplyKeyboardRemove · ForceReply | Opsional | Tombol |
disable_notification | Boolean | Opsional | Kirim tanpa suara |
parse_mode, entities, reply_parameters, link_preview_options … | Diabaikan | Diterima 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tujuan |
photo | InputFile atau String | Ya | Berkas yang diunggah dengan multipart/form-data (hingga 10MB, JPEG/PNG/GIF), atau file_id foto yang pernah diterima. URL belum didukung |
caption | String | Opsional | 0–1.024 karakter |
reply_markup | Sama dengan sendMessage | Opsional | |
disable_notification | Boolean | Opsional |
Mengembalikan: Message yang dikirim (dengan file_id baru di photo)
sendDocument
POST/bot<token>/sendDocument
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tujuan |
document | InputFile atau String | Ya | Berkas yang diunggah dengan multipart/form-data (tanpa batasan format, hingga 20MB), atau file_id berkas yang pernah diterima. URL belum didukung |
filename | String | Opsional | Nama yang tampil di sisi penerima. Jika kosong, nama berkas yang diunggah yang dipakai |
caption | String | Opsional | 0–1.024 karakter |
reply_markup | Sama dengan sendMessage | Opsional | |
disable_notification | Boolean | Opsional | |
thumbnail, disable_content_type_detection | Diabaikan | Diterima, 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tujuan |
latitude, longitude | Float | Ya | Lintang (−90 sampai 90) dan bujur (−180 sampai 180). Jika di luar rentang, hasilnya 400 Bad Request: GEO_POINT_INVALID |
horizontal_accuracy | Float | Opsional | Radius ketidakpastian dalam meter, 0–1.500. Dibulatkan menjadi bilangan bulat saat disimpan |
live_period | Integer | Opsional | Menjadikannya lokasi langsung: 60–86.400 detik, atau 2147483647 (0x7FFFFFFF) sampai dihentikan. Nilai lain menghasilkan 400 Bad Request: wrong live_period |
heading | Integer | Opsional | Arah gerak lokasi langsung, 1–360 derajat |
proximity_alert_radius | Integer | Opsional | Radius peringatan kedekatan lokasi langsung, dalam meter. Disimpan dan ditampilkan, tetapi peringatannya belum dikirim |
reply_markup | Sama dengan sendMessage | Opsional | |
disable_notification | Boolean | Opsional |
Mengembalikan: Message yang dikirim (dengan Location di location)
sendVenue
POST/bot<token>/sendVenue
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tujuan |
latitude, longitude | Float | Ya | Letak tempat itu (sama seperti sendLocation) |
title | String | Ya | Nama tempat |
address | String | Ya | Alamat |
foursquare_id, foursquare_type | String | Opsional | ID dan jenis tempat di Foursquare, diteruskan apa adanya |
google_place_id, google_place_type | String | Opsional | ID dan jenis tempat di Google. Hanya dipakai jika tidak ada foursquare_id |
reply_markup | Sama dengan sendMessage | Opsional | |
disable_notification | Boolean | Opsional |
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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tujuan |
phone_number | String | Ya | Nomor telepon, diteruskan sesuai yang ditulis |
first_name | String | Ya | Nama depan |
last_name | String | Opsional | Nama belakang |
vcard | String | Opsional | Informasi tambahan dalam format vCard, hingga 64KB |
reply_markup | Sama dengan sendMessage | Opsional | |
disable_notification | Boolean | Opsional |
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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tempat pesan itu berada |
message_id | Integer | Ya | Lokasi langsung yang akan dipindahkan (yang dikirim bot) |
latitude, longitude | Float | Ya | Posisi baru |
horizontal_accuracy | Float | Opsional | Radius ketidakpastian dalam meter, 0–1.500 |
heading | Integer | Opsional | Arah gerak, 1–360 derajat |
proximity_alert_radius | Integer | Opsional | Radius peringatan kedekatan dalam meter. 0 berarti dimatikan |
live_period | Integer | Opsional | Periode 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_markup | InlineKeyboardMarkup | Opsional | Tombol baru |
inline_message_id | String | Tidak didukung | 400 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tempat pesan itu berada |
message_id | Integer | Ya | Pesan yang akan diedit (yang dikirim bot) |
text | String | Ya | Teks baru, 1–4.096 karakter |
reply_markup | InlineKeyboardMarkup | Opsional | Tombol baru. Jika dihilangkan, tombolnya ikut hilang (sama seperti Telegram) |
inline_message_id | String | Tidak didukung | 400 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.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
callback_query_id | String | Ya | callback_query.id dari update |
text | String | Opsional | Teks yang muncul sebentar di atas layar |
show_alert | Boolean | Opsional | Jika true, ditampilkan dalam jendela dengan tombol OK |
url | String | Opsional | Alamat yang akan dibuka aplikasi |
cache_time | Integer | Opsional | Berapa 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
commands | Array of BotCommand | Ya | Maksimal 100 |
language_code | String | Opsional | Disimpan sebagai daftar per bahasa. Saat ini aplikasi hanya menampilkan daftar bawaan tanpa kode bahasa |
scope | BotCommandScope | Diabaikan |
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.
| Kolom | Tipe | Deskripsi |
|---|---|---|
update_id | Integer | Nomor yang bertambah 1 setiap kali. Dipakai untuk offset pada getUpdates |
message opsional | Message | Pesan baru untuk bot (obrolan 1:1, atau semua pesan di grup tempat bot menjadi anggota) |
edited_message opsional | Message | Pesan yang diedit |
callback_query opsional | CallbackQuery | Tombol inline ditekan |
voice_call opsional | VoiceCall | Mulai dan berakhirnya panggilan ke bot suara atau panggilan yang dibuatnya (hanya datang jika diminta dengan namanya) |
voice_call_tool_query opsional | VoiceCallToolQuery | Tool bot yang dipanggil model selama panggilan (hanya datang jika diminta dengan namanya) |
voice_call_transcript opsional | VoiceCallTranscript | Satu giliran transkrip selama panggilan (hanya datang jika diminta dengan namanya) |
User
| Kolom | Tipe | Deskripsi |
|---|---|---|
id | Integer | ID pengguna (hanya bermakna di dalam server ini) |
is_bot | Boolean | true jika bot |
first_name | String | Nama depan. Deleted Account jika akunnya sudah dihapus |
last_name opsional | String | Nama belakang |
username opsional | String | Nama pengguna (tanpa @) |
Chat
| Kolom | Tipe | Deskripsi |
|---|---|---|
id | Integer | Untuk orang, ID orang tersebut (bilangan positif); untuk grup biasa, bilangan negatif |
type | String | private atau group |
title opsional | String | Nama grup (group) |
first_name, last_name, username opsional | String | Nama dan nama pengguna lawan bicara (private) |
Message
| Kolom | Tipe | Deskripsi |
|---|---|---|
message_id | Integer | Nomor pesan di dalam obrolan ini |
from opsional | User | Pengirim |
chat | Chat | Obrolan tempat pesan itu berada |
date | Integer | Waktu dikirim (detik Unix) |
edit_date opsional | Integer | Waktu terakhir diedit |
text opsional | String | Teks (selalu ada jika bukan pesan foto, berkas, lokasi, tempat, atau kontak) |
entities opsional | Array of MessageEntity | Perintah, sebutan, URL, dan tagar di dalam teks |
photo opsional | Array of PhotoSize | Foto (di Pabal hanya satu, yaitu ukuran asli) |
document opsional | Document | Berkas |
location opsional | Location | Lokasi atau lokasi langsung. Pesan tempat juga membawa lokasinya di sini |
venue opsional | Venue | Tempat |
contact opsional | Contact | Kartu kontak |
caption opsional | String | Keterangan foto |
caption_entities opsional | Array of MessageEntity | Perintah, sebutan, URL, dan tagar di dalam keterangan |
reply_markup opsional | InlineKeyboardMarkup | Tombol inline yang terpasang pada pesan |
MessageEntity
| Kolom | Tipe | Deskripsi |
|---|---|---|
type | String | bot_command, mention, url, hashtag |
offset | Integer | Posisi awal (dalam unit kode UTF-16) |
length | Integer | Panjang (dalam unit kode UTF-16) |
Server otomatis menemukannya di dalam teks dan menambahkannya. Entitas format seperti tebal dan miring belum ada.
PhotoSize
| Kolom | Tipe | Deskripsi |
|---|---|---|
file_id | String | ID untuk mengunduh (getFile) dan mengirim ulang (sendPhoto) |
file_unique_id | String | Bernilai sama untuk foto yang sama, meskipun botnya berbeda. Tidak bisa dipakai untuk mengunduh |
width, height | Integer | Ukuran dalam piksel |
file_size | Integer | Byte |
Document
| Kolom | Tipe | Deskripsi |
|---|---|---|
file_id | String | ID untuk mengunduh (getFile) dan mengirim ulang (sendDocument) |
file_unique_id | String | Bernilai sama untuk berkas yang sama, meskipun botnya berbeda. Tidak bisa dipakai untuk mengunduh |
file_name | String | Nama yang diberikan pengirim |
mime_type | String | Format yang disebutkan pengirim |
file_size | Integer | Byte |
Location
| Kolom | Tipe | Deskripsi |
|---|---|---|
latitude, longitude | Float | Lintang dan bujur |
horizontal_accuracy opsional | Float | Radius ketidakpastian dalam meter |
live_period opsional | Integer | Periode berbagi lokasi langsung, dalam detik yang dihitung sejak pesan dikirim. Setelah dihentikan, periodenya dipendekkan menjadi waktu yang benar-benar berlalu |
heading opsional | Integer | Arah gerak, 1–360 derajat |
proximity_alert_radius opsional | Integer | Radius peringatan kedekatan dalam meter |
Lokasi langsung yang dibagikan seseorang datang lagi sebagai edited_message setiap kali server menerapkan sebuah perpindahan.
Venue
| Kolom | Tipe | Deskripsi |
|---|---|---|
location | Location | Letak tempat itu |
title | String | Nama tempat |
address | String | Alamat |
foursquare_id, foursquare_type opsional | String | ID dan jenis tempat di Foursquare |
google_place_id, google_place_type opsional | String | ID dan jenis tempat di Google |
Contact
| Kolom | Tipe | Deskripsi |
|---|---|---|
phone_number | String | Nomornya, persis seperti yang ditulis pengirim |
first_name | String | Nama depan |
last_name opsional | String | Nama belakang |
user_id opsional | Integer | Akun Pabal dengan nomor itu. Hanya ada jika pengirim sudah menyimpan orang itu di kontaknya, atau jika itu dirinya sendiri |
vcard opsional | String | Informasi tambahan dalam format vCard |
File
| Kolom | Tipe | Deskripsi |
|---|---|---|
file_id, file_unique_id | String | Sama dengan PhotoSize |
file_size | Integer | Byte |
file_path | String | Berbentuk photos/<file_id>.jpg atau documents/<file_id>. Tempelkan di belakang /file/bot<token>/ untuk mengunduh |
CallbackQuery
| Kolom | Tipe | Deskripsi |
|---|---|---|
id | String | ID yang diberikan ke answerCallbackQuery |
from | User | Orang yang menekan tombol |
message opsional | Message | Pesan tempat tombol itu terpasang |
chat_instance | String | Nilai yang mewakili obrolan tersebut |
data opsional | String | callback_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
| Kolom | Tipe | Deskripsi |
|---|---|---|
text | String | Teks tombol |
callback_data salah satu | String | Nilai yang dikirim ke bot saat ditekan, 1–64 byte |
url salah satu | String | Alamat yang dibuka saat ditekan |
Jenis lain seperti switch_inline_query, web_app, login_url, dan pay belum ada (400).
ReplyKeyboardMarkup
| Kolom | Tipe | Deskripsi |
|---|---|---|
keyboard | Array of Array of KeyboardButton | Papan tombol di bawah kolom input |
resize_keyboard, one_time_keyboard, is_persistent, selective opsional | Boolean | Sesuaikan ukuran · sembunyikan setelah sekali pakai · selalu tampil · hanya untuk orang tertentu |
input_field_placeholder opsional | String | Teks 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
| Kolom | Tipe | Deskripsi |
|---|---|---|
command | String | 1–32 karakter huruf Latin kecil, angka, dan garis bawah (tanpa /) |
description | String | 1–256 karakter |
WebhookInfo
| Kolom | Tipe | Deskripsi |
|---|---|---|
url | String | Alamat webhook; string kosong jika tidak ada |
has_custom_certificate | Boolean | Selalu false |
pending_update_count | Integer | Jumlah update yang menunggu dikirim |
ip_address opsional | String | IP tujuan pengiriman terakhir |
last_error_date opsional | Integer | Waktu kegagalan terakhir (detik Unix) |
last_error_message opsional | String | Alasan kegagalan terakhir (daftar) |
max_connections opsional | Integer | Nilai yang diberikan ke setWebhook |
allowed_updates opsional | Array of String | Nilai 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).
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
enabled | Boolean | Opsional | Menyalakan hanya bisa setelah aturan bot suara disetujui di @BotFather (403 VOICE_RULES_NOT_ACCEPTED). Mematikan selalu bisa |
instructions | String | Opsional | Instruksi model, hingga 8.192 byte. "" menghapusnya (tidak bisa untuk bot terkelola yang menyala) |
greeting | String | Opsional | Salam pembuka, hingga 512 byte. Jika "", model menyapa dengan sendirinya |
voice | String | Opsional | ID suara, bawaan kore (daftar) |
language | String | Opsional | ko-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_duration | Integer | Opsional | Detik, 60 sampai limits.max_call_duration |
max_concurrent_calls | Integer | Opsional | 1 sampai limits.max_concurrent_calls |
tools | Array of VoiceCallTool | Opsional | Tool bot yang bisa dipanggil model selama panggilan: {"name", "description", "parameters"?, "timeout_ms"?}. Aturannya di Mendefinisikan tool. Di formulir, berupa string JSON |
transcript | Boolean | Opsional | Sakelar transkrip. Menyalakannya hanya bisa setelah ketentuan pemilik bot disetujui |
mode | String | Opsional | managed (model AI Pabal) atau stream (mode stream) |
stream_url, stream_secret | String | Opsional | Bersama 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
voice_call_id | String | Ya | voice_call.id |
farewell | Boolean | Opsional | Bawaan 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
voice_call_id | String | Ya | Panggilan yang sedang tersambung |
text | String | Ya | Catatan pemilik bot untuk model. Hingga 2.000 karakter dan 6.144 byte, diperiksa dengan aturan konten |
respond | Boolean | Opsional | Bawaan 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
period | String | Opsional | today (bawaan) atau month |
month | String | Opsional | YYYY-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.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
user_id | Integer | Ya | Orang yang akan ditelepon |
purpose | String | Ya | Yang dipilih bot dari reminder, wake_up, delivery, appointment |
context | String | Ya | Yang hanya diketahui model, sampai 1.000 karakter dan 3.072 byte, diperiksa dengan aturan konten |
max_duration | Integer | opsional | Lama maksimum setelah dijawab, dalam detik, 30–300 (sampai batas bot). Bawaan 180 |
ring_timeout | Integer | opsional | Detik 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
tool_query_id | String | Ya | id dari VoiceCallToolQuery |
result | String · Object · Array | Salah satu | Hasil tool, hingga 16.384 byte |
error | String | Salah satu | Pesan 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
provider | String | Ya | google (kunci JSON akun layanan Vertex AI) atau openai (sk-…) |
api_key | String | Ya | Kuncinya. 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
| Metode | Parameter | Mengembalikan |
|---|---|---|
setVoiceCallMcpServer | label, url, auth (objek), opsional audience, allowed_tools, requested_level, timeout_ms, tools (klasifikasi tambahan dari pemilik), declaration, auto_repin | Hasil pendaftaran (status, job_id). Jika penerimanya berubah: 400 MCP_CHANGE_NEEDS_CONFIRMATION, lalu konfirmasi di @BotFather |
refreshVoiceCallMcpServer | label | Pemeriksaan ulang (refreshing: true, job_id) |
deleteVoiceCallMcpServer | label | True — tetap bisa meskipun MCP mati |
getVoiceCallMcpBinding | Tidak ada | iss, sub (bot:<id>), issuer_document, jwks_uri, audiences |
createVoiceCallMcpClientKey | label | jwk 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
| Kolom | Tipe | Deskripsi |
|---|---|---|
id | String | ID panggilan (desimal tak bertanda) |
direction | String | incoming (panggilan ke bot) atau outgoing (panggilan yang dibuat bot). Selalu ada |
event | String | started, ended, missed, refused; untuk panggilan yang dibuat bot, started, ended, not_answered, failed |
from opsional | User | Khusus panggilan ke bot — penelepon: id, is_bot, first_name, last_name, language_code. Tanpa nama pengguna dan nomor telepon |
to opsional | Object | Khusus panggilan yang dibuat bot — {"id": …}, hanya id penerima panggilan |
purpose opsional | String | Khusus panggilan yang dibuat bot — tujuan permintaan |
date | Integer | Waktu 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 opsional | Integer | Durasi maksimum panggilan ini (detik) — started, ended |
start_date, duration opsional | Integer | Waktu tersambung dan lama tersambung dalam detik (jam server) — ended |
end_reason opsional | String | caller (callee untuk panggilan yang dibuat bot), bot, max_length, failed, operator, suspended — ended, missed |
refused_reason opsional | String | busy, budget, unavailable — refused |
transcript opsional | Object | {"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
| Kolom | Tipe | Deskripsi |
|---|---|---|
id | String | ID yang diberikan ke answerVoiceCallToolQuery |
voice_call_id | String | ID panggilan |
from | User | Penelepon (kolom yang sama dengan VoiceCall) |
name | String | Nama tool |
arguments | String | Argumen, berupa teks objek JSON (sudah diperiksa server) |
budget_ms | Integer | Milidetik sejak diterima sampai jawaban harus tiba di server |
VoiceCallTranscript
| Kolom | Tipe | Deskripsi |
|---|---|---|
voice_call_id | String | ID panggilan |
seq | Integer | Nomor giliran |
role | String | caller atau bot |
text | String | Teks yang ditulis AI. Jika berisi nomor kartu atau nomor identitas kependudukan, angkanya diganti * |
is_final | Boolean | Selalu true |
offset_ms, date | Integer | Milidetik 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>").hostadalah host URL yang Anda berikan. Periksa 300 detik, nonce sekali pakai, perbandingan byte demi byte, dan apakahstart.call_idsama dengancall(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 setelahstart, paling pertama) · audio (setelahlive) ·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_modedanentitiesdiabaikan, 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 membawauser_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_connectionshanya 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…) menghasilkan404 Not Found: method not found.