Langsung ke konten

Untuk developer

API Bot MAKE chat.

Bangun bot untuk Makechat dengan API yang mirip Bot API Telegram: buat bot lewat @makebot, terima pesan dengan getUpdates atau webhook, lalu balas dengan teks, file, dan tombol.

01

Mulai: membuat bot

Buka Makechat (aplikasi atau web), cari @makebot, tekan Mulai, lalu kirim /newbot. Ikuti pertanyaannya: nama tampilan bot, lalu username yang berakhiran bot (misalnya catatan_kas_bot). Setelah selesai, @makebot mengirim token bot, misalnya:

4839201:AAHk3x9-contoh-token-jangan-dipakai

Token adalah kunci penuh untuk bot kamu. Lewat @makebot kamu juga bisa mengubah nama, foto, deskripsi, dan daftar perintah bot, atau membuat token baru dengan /revoke.

Chat dengan bot tidak dienkripsi end-to-end. Server Make dan bot bisa membaca pesan yang dikirim pengguna ke bot. Pengguna melihat pemberitahuan ini di setiap chat bot.

02

Membuat permintaan

Semua metode dipanggil lewat HTTPS dengan alamat:

https://api-make.fivehoster.co.id/api/v1/bot/<TOKEN>/<METHOD>

Parameter boleh dikirim dengan salah satu cara berikut:

  • GET dengan query string, misalnya ?chat_id=...&text=Halo
  • POST dengan application/json
  • POST dengan application/x-www-form-urlencoded (objek seperti reply_markup dikirim sebagai teks JSON)
  • POST dengan multipart/form-data, wajib untuk mengunggah file

Jawaban selalu JSON. Jika berhasil:

{ "ok": true, "result": { ... } }

Jika gagal, kode HTTP sama dengan error_code:

{ "ok": false, "error_code": 400, "description": "Bad Request: message text is empty" }

{ "ok": false, "error_code": 429, "description": "Too Many Requests: retry after 3", "parameters": { "retry_after": 3 } }
FieldTipeKeterangan
400Bad RequestParameter salah atau kurang.
401UnauthorizedToken salah atau sudah dicabut.
403ForbiddenPengguna belum menekan Mulai atau sudah menghentikan bot.
404Not FoundMetode, pesan, atau file tidak ditemukan.
409ConflictgetUpdates dipanggil saat webhook aktif.
429Too Many RequestsTerlalu cepat. Tunggu parameters.retry_after detik.
03

Menerima update

Ada dua cara yang tidak bisa dipakai bersamaan: getUpdates (long polling) atau webhook. Update yang belum diambil disimpan selama 24 jam, lalu dibuang.

getUpdates (long polling)

Panggil getUpdates berulang kali. Isi offset dengan update_id terakhir + 1 untuk menandai update sebelumnya sudah diterima. Dengan timeout (sampai 50 detik), server menahan permintaan sampai ada update baru.

ParameterTipeWajibKeterangan
offsetIntegerTidakID update pertama yang ingin diambil. Semua update sebelumnya dianggap sudah diterima.
limitIntegerTidak1 sampai 100, bawaan 100.
timeoutIntegerTidakLama menunggu dalam detik, 0 sampai 50. Bawaan 0 (langsung menjawab).

Webhook

Dengan setWebhook, Make mengirim setiap update sebagai POST JSON ke alamat kamu. Alamat harus https dengan port 443, 80, 88, atau 8443. Jika kamu mengisi secret_token, nilainya dikirim balik di header X-Make-Bot-Api-Secret-Token pada setiap permintaan, jadi kamu bisa memastikan permintaan itu dari Make. Jawab dengan status 2xx secepatnya. Jika server kamu gagal atau lambat, update dikirim ulang dengan jeda yang makin lama (sampai sekitar 10 menit) selama masih dalam 24 jam.

ParameterTipeWajibKeterangan
urlStringYaAlamat https webhook. Kosongkan untuk mematikan webhook.
secret_tokenStringTidak1 sampai 256 karakter A-Z, a-z, 0-9, _ dan -. Dikirim di header X-Make-Bot-Api-Secret-Token.
allowed_updatesArray of StringTidakJenis update yang ingin diterima, misalnya ["message", "callback_query"]. Kosong berarti semua.
drop_pending_updatesBooleanTidaktrue untuk membuang update yang belum terkirim.

getWebhookInfo menampilkan alamat webhook, jumlah update yang menunggu (pending_update_count), dan error terakhir (last_error_date, last_error_message). deleteWebhook mematikan webhook (boleh dengan drop_pending_updates) supaya kamu bisa kembali memakai getUpdates.

04

Objek Update & Message

Update

FieldTipeKeterangan
update_idIntegerNomor urut update. Pakai untuk offset getUpdates.
messageMessageOpsional. Pesan baru dari pengguna (termasuk /start saat pengguna menekan Mulai).
callback_queryCallbackQueryOpsional. Pengguna menekan tombol inline dengan callback_data.
my_chat_memberChatMemberUpdatedOpsional. Pengguna menghentikan atau memulai lagi bot, atau bot ditambahkan ke / dikeluarkan dari grup atau channel.
channel_postMessageOpsional. Post baru di channel tempat bot menjadi admin.
inline_queryInlineQueryOpsional. Pengguna mengetik @username bot (mode inline).
chosen_inline_resultChosenInlineResultOpsional. Pengguna memilih salah satu hasil inline.

Message

FieldTipeKeterangan
message_idInteger atau StringID pesan di chat ini. Integer di chat pribadi, string di grup dan channel.
fromUserPengirim: id (UUID), is_bot, first_name, last_name, username.
chatChatid = ID pengguna, grup, atau channel (UUID string); type = "private", "group", atau "channel".
dateIntegerWaktu kirim, Unix time (detik).
edit_dateIntegerOpsional. Waktu terakhir diedit.
textStringOpsional. Isi pesan teks.
entitiesArray of MessageEntityOpsional. Format dan bagian khusus teks, termasuk bot_command untuk /perintah.
captionStringOpsional. Keterangan file.
photoArray of PhotoSizeOpsional. Foto, dengan file_id, width, height, file_size.
document / video / audio / voiceObjectOpsional. File dengan file_id, file_name, mime_type, file_size (dan duration untuk video, audio, voice).
reply_to_messageMessageOpsional. Pesan yang dibalas.
reply_markupInlineKeyboardMarkupOpsional. Tombol inline yang terpasang di pesan.

Contoh update saat pengguna mengirim perintah:

{
  "update_id": 1042,
  "message": {
    "message_id": 87,
    "from": { "id": "6f1c2a3b-0000-4000-8000-1234567890ab", "is_bot": false, "first_name": "Rina", "username": "rina" },
    "chat": { "id": "6f1c2a3b-0000-4000-8000-1234567890ab", "type": "private", "first_name": "Rina", "username": "rina" },
    "date": 1760500000,
    "text": "/saldo bulan ini",
    "entities": [{ "type": "bot_command", "offset": 0, "length": 6 }]
  }
}

CallbackQuery

Berisi id (untuk answerCallbackQuery), from, message (pesan yang tombolnya ditekan), chat_instance, dan data (callback_data tombol).

MessageEntity

type salah satu dari bold, italic, underline, strikethrough, code, pre, text_link (dengan url), spoiler, url, mention, atau bot_command; offset dan length dihitung dalam UTF-16 code unit, sama seperti Telegram.

05

Daftar metode

getMe

Tanpa parameter. Mengembalikan User bot: id, is_bot, first_name, username, dan kemampuan bot.

getUpdates

Lihat bagian Menerima update. Mengembalikan Array of Update.

setWebhook

Lihat bagian Menerima update. Mengembalikan true.

deleteWebhook

Mematikan webhook. Mengembalikan true.

ParameterTipeWajibKeterangan
drop_pending_updatesBooleanTidaktrue untuk membuang update yang menunggu.

getWebhookInfo

Mengembalikan WebhookInfo: url, has_custom_certificate, pending_update_count, last_error_date, last_error_message, allowed_updates.

sendMessage

Mengirim pesan teks. Mengembalikan Message yang terkirim.

HTML yang didukung: <b>, <i>, <u>, <s>, <code>, <pre>, <a href="...">, dan <tg-spoiler>. Markdown: *tebal*, _miring_, `kode`, [teks](https://...).

ParameterTipeWajibKeterangan
chat_idStringYaID chat dari message.chat.id: ID pengguna (chat pribadi), ID grup, atau ID channel / @username channel publik.
textStringYa1 sampai 4096 karakter setelah format dibaca.
parse_modeStringTidakHTML atau Markdown.
entitiesArray of MessageEntityTidakFormat manual sebagai ganti parse_mode.
reply_markupObject (JSON)TidakInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, atau ForceReply.
reply_to_message_idIntegerTidakMembalas pesan tertentu.
disable_notificationBooleanTidaktrue agar pengguna tidak menerima notifikasi push.

sendPhoto / sendDocument / sendVideo / sendAudio / sendVoice

Mengirim file. Nama field file sama dengan jenisnya. Foto harus JPEG, PNG, atau WebP. Mengembalikan Message.

ParameterTipeWajibKeterangan
chat_idStringYaID chat dari message.chat.id: ID pengguna (chat pribadi), ID grup, atau ID channel / @username channel publik.
photo / document / video / audio / voiceFile atau StringYaUnggah multipart (maksimal 10 MB) atau file_id yang sudah pernah dipakai bot ini. URL tidak diunduh.
captionStringTidakKeterangan, maksimal 1024 karakter.
parse_modeStringTidakHTML atau Markdown.
caption_entitiesArray of MessageEntityTidakFormat manual untuk caption.
durationIntegerTidakDurasi dalam detik (video, audio, voice).
reply_markupObject (JSON)TidakInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, atau ForceReply.
reply_to_message_idIntegerTidakMembalas pesan tertentu.
disable_notificationBooleanTidakTanpa notifikasi push.

editMessageText

Mengubah teks pesan bot. Pengguna melihat tanda diedit. Mengembalikan Message.

ParameterTipeWajibKeterangan
chat_idStringYaID chat dari message.chat.id: ID pengguna (chat pribadi), ID grup, atau ID channel / @username channel publik.
message_idIntegerYaPesan bot yang diedit.
textStringYaTeks baru.
parse_modeStringTidakHTML atau Markdown.
entitiesArray of MessageEntityTidakFormat manual.
reply_markupObject (JSON)TidakInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, atau ForceReply.

editMessageCaption

Mengubah caption file. Mengembalikan Message.

ParameterTipeWajibKeterangan
chat_idStringYaID chat dari message.chat.id: ID pengguna (chat pribadi), ID grup, atau ID channel / @username channel publik.
message_idIntegerYaPesan bot yang diedit.
captionStringTidakCaption baru.
parse_modeStringTidakHTML atau Markdown.
caption_entitiesArray of MessageEntityTidakFormat manual.
reply_markupObject (JSON)TidakInlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, atau ForceReply.

editMessageReplyMarkup

Mengganti tombol inline saja. Mengembalikan Message.

ParameterTipeWajibKeterangan
chat_idStringYaID chat dari message.chat.id: ID pengguna (chat pribadi), ID grup, atau ID channel / @username channel publik.
message_idIntegerYaPesan bot yang diubah.
reply_markupInlineKeyboardMarkupTidakTombol baru. Kosongkan untuk menghapus tombol.

deleteMessage

Menghapus pesan bot (filenya ikut dihapus). Mengembalikan true.

ParameterTipeWajibKeterangan
chat_idStringYaID chat dari message.chat.id: ID pengguna (chat pribadi), ID grup, atau ID channel / @username channel publik.
message_idIntegerYaPesan yang dihapus.

answerCallbackQuery

Menjawab tombol yang ditekan. Jawab dalam sekitar 8 detik, setelah itu pengguna tidak melihat apa pun. Mengembalikan true.

ParameterTipeWajibKeterangan
callback_query_idStringYaid dari CallbackQuery.
textStringTidakMaksimal 200 karakter. Tampil sebagai notifikasi singkat.
show_alertBooleanTidaktrue untuk menampilkan kotak peringatan yang harus ditutup pengguna.

sendChatAction

Menampilkan status seperti "mengetik…" di chat selama beberapa detik. Mengembalikan true.

ParameterTipeWajibKeterangan
chat_idStringYaID chat dari message.chat.id: ID pengguna (chat pribadi), ID grup, atau ID channel / @username channel publik.
actionStringYatyping, upload_photo, upload_video, upload_document, upload_voice, dan lainnya.

setMyCommands

Mengatur daftar perintah di tombol Menu dan saran saat pengguna mengetik /. Mengembalikan true.

ParameterTipeWajibKeterangan
commandsArray of BotCommandYaMaksimal 100. Tiap item: command (1–32 huruf kecil, angka, _) dan description (1–256 karakter).

getMyCommands

Mengembalikan Array of BotCommand.

deleteMyCommands

Menghapus semua perintah. Mengembalikan true.

setMyDescription

Mengembalikan true.

ParameterTipeWajibKeterangan
descriptionStringTidakMaksimal 512 karakter. Tampil di chat kosong: Apa yang bisa dilakukan bot ini?

setMyShortDescription

Mengembalikan true.

ParameterTipeWajibKeterangan
short_descriptionStringTidakMaksimal 120 karakter. Tampil di profil bot.

getFile

Mengembalikan File: file_id, file_unique_id, file_size, file_path. Unduh isinya dengan GET ke /api/v1/bot/<TOKEN>/file/<file_id>.

ParameterTipeWajibKeterangan
file_idStringYafile_id dari pesan.
06

Tombol & keyboard

InlineKeyboardMarkup

Tombol di bawah pesan: { "inline_keyboard": [[ InlineKeyboardButton, ... ], ...] }. Maksimal 100 tombol, 8 per baris. Setiap tombol punya text dan tepat satu dari:

  • callback_data: 1 sampai 64 byte. Saat ditekan, bot menerima callback_query. Jawab dengan answerCallbackQuery.
  • url: hanya http atau https. Pengguna diminta konfirmasi sebelum link dibuka.
  • switch_inline_query / switch_inline_query_current_chat: mengisi kolom ketik dengan @username bot dan teks ini.

ReplyKeyboardMarkup

Tombol pengganti kolom ketik: { "keyboard": [[{ "text": "Ya" }, { "text": "Tidak" }]] }. Menekan tombol mengirim teksnya sebagai pesan. Opsi: resize_keyboard, one_time_keyboard (disembunyikan setelah dipakai), input_field_placeholder, is_persistent.

ReplyKeyboardRemove

{ "remove_keyboard": true } menghapus keyboard yang dikirim sebelumnya.

ForceReply

{ "force_reply": true, "input_field_placeholder": "Tulis nominal" } membuka balasan ke pesan tersebut, cocok untuk pertanyaan langkah demi langkah.

07

File

File dikirim dengan multipart/form-data, maksimal 10 MB. Kamu juga bisa mengirim ulang file yang sudah dimiliki bot dengan file_id-nya. Bot tidak mengunduh file dari URL. File dari pengguna diambil dengan getFile lalu diunduh dari /api/v1/bot/<TOKEN>/file/<file_id>. File di chat bot tidak dienkripsi end-to-end.

08

Batas & aturan

  • Maksimal 30 permintaan per detik untuk setiap bot.
  • Sekitar 1 pesan per detik ke chat yang sama. Lebih dari itu dijawab 429 dengan parameters.retry_after.
  • Bot hanya bisa mengirim pesan ke pengguna yang sudah menekan Mulai. Jika pengguna menghentikan bot, permintaan dijawab 403 sampai pengguna memulainya lagi.
  • Callback query harus dijawab dalam sekitar 8 detik.
  • Update disimpan selama 24 jam.
  • Teks pesan maksimal 4096 karakter, caption 1024 karakter.
09

Keamanan

  • Simpan token di server atau variabel lingkungan. Jangan taruh di aplikasi, situs web, atau repositori publik.
  • Jika token bocor, kirim /revoke ke @makebot. Token lama langsung berhenti bekerja.
  • Pakai secret_token di setWebhook dan periksa header X-Make-Bot-Api-Secret-Token di setiap permintaan webhook.
  • Jangan meminta kata sandi, kode OTP, atau nomor kartu lewat bot.
10

Contoh kode

curl

# Cek token
curl "https://api-make.fivehoster.co.id/api/v1/bot/<TOKEN>/getMe"

# Kirim pesan dengan tombol inline
curl -X POST "https://api-make.fivehoster.co.id/api/v1/bot/<TOKEN>/sendMessage" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": "6f1c2a3b-0000-4000-8000-1234567890ab",
    "text": "<b>Halo!</b> Pilih menu:",
    "parse_mode": "HTML",
    "reply_markup": {
      "inline_keyboard": [[
        { "text": "Saldo", "callback_data": "saldo" },
        { "text": "Bantuan", "url": "https://makebetter.space/support" }
      ]]
    }
  }'

# Kirim foto (multipart, maksimal 10 MB)
curl -F chat_id=6f1c2a3b-0000-4000-8000-1234567890ab \
     -F caption="Laporan bulan ini" \
     -F [email protected] \
     "https://api-make.fivehoster.co.id/api/v1/bot/<TOKEN>/sendPhoto"

Node.js: getUpdates

// Node.js 18+ (fetch bawaan). Jalankan: TOKEN=xxxx node bot.mjs
const API = `https://api-make.fivehoster.co.id/api/v1/bot/${process.env.TOKEN}`;

async function call(method, body = {}) {
  const res = await fetch(`${API}/${method}`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(body),
  });
  const data = await res.json();
  if (!data.ok) {
    const wait = data.parameters?.retry_after;
    if (wait) await new Promise((r) => setTimeout(r, wait * 1000));
    throw new Error(`${method}: ${data.error_code} ${data.description}`);
  }
  return data.result;
}

let offset = 0;
for (;;) {
  try {
    const updates = await call("getUpdates", { offset, timeout: 50 });
    for (const u of updates) {
      offset = u.update_id + 1;
      if (u.message?.text === "/start") {
        await call("sendMessage", {
          chat_id: u.message.chat.id,
          text: "Halo! Ketik /saldo untuk mencoba.",
          reply_markup: { inline_keyboard: [[{ text: "Coba tombol", callback_data: "ping" }]] },
        });
      } else if (u.callback_query) {
        await call("answerCallbackQuery", { callback_query_id: u.callback_query.id, text: "Pong!" });
      }
    }
  } catch (e) {
    console.error(e.message);
    await new Promise((r) => setTimeout(r, 3000));
  }
}

Node.js: webhook dengan Express

// npm i express — lalu: TOKEN=xxxx SECRET=rahasia-panjang node webhook.mjs
import express from "express";

const API = `https://api-make.fivehoster.co.id/api/v1/bot/${process.env.TOKEN}`;
const app = express();
app.use(express.json());

app.post("/make-bot", async (req, res) => {
  // Tolak permintaan yang bukan dari MAKE.
  if (req.get("X-Make-Bot-Api-Secret-Token") !== process.env.SECRET) return res.sendStatus(401);
  res.sendStatus(200); // jawab cepat, proses sesudahnya

  const message = req.body.message;
  if (message?.text) {
    await fetch(`${API}/sendMessage`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ chat_id: message.chat.id, text: `Kamu menulis: ${message.text}` }),
    });
  }
});

app.listen(8443);

// Sekali saja, untuk mendaftarkan webhook:
// curl -X POST "${API}/setWebhook" -H "Content-Type: application/json" \
//   -d '{"url":"https://bot.contoh.com:8443/make-bot","secret_token":"rahasia-panjang"}'
11

Bot di grup

Anggota grup menambahkan bot lewat Info grup → Tambah bot (bagi yang boleh menambah anggota). Bot ikut tampil di daftar anggota dan bisa dikeluarkan seperti anggota lain. Bot hanya bisa ditambahkan ke grup jika pemiliknya mengizinkan (pengaturan join groups di @makebot).

Grup tetap terenkripsi end-to-end. Bot tidak punya kunci grup, jadi bot hanya menerima pesan yang ditujukan kepadanya: aplikasi pengirim mengirim salinan tanpa enkripsi khusus untuk pesan berikut, dan pengirim melihat pemberitahuannya sebelum mengirim.

  • /perintah diterima semua bot di grup; /perintah@username_bot hanya diterima bot itu.
  • Pesan yang menyebut @username_bot.
  • Balasan ke pesan bot itu sendiri.

Di update, chat.type bernilai "group" dan chat.id adalah ID grup; pakai ID itu sebagai chat_id saat membalas. Di grup, message_id berupa string (bukan integer), jadi simpan apa adanya untuk reply_to_message_id, editMessageText, dan deleteMessage.

{
  "update_id": 2051,
  "message": {
    "message_id": "c1f0e6a2-7d4b-4a51-9c0e-3b2a1d0f9e88",
    "from": { "id": "6f1c2a3b-0000-4000-8000-1234567890ab", "is_bot": false, "first_name": "Rina", "username": "rina" },
    "chat": { "id": "0b6d9a7e-1111-4000-8000-abcdefabcdef", "type": "group", "title": "Kas Arisan" },
    "date": 1760500000,
    "text": "/saldo@catatan_kas_bot",
    "entities": [{ "type": "bot_command", "offset": 0, "length": 22 }]
  }
}

Pesan bot di grup bisa memakai format teks, file, dan tombol inline. Tombol callback_data mengirim callback_query seperti di chat pribadi; jawab dengan answerCallbackQuery. Bot bisa mengedit (editMessageText, editMessageCaption, editMessageReplyMarkup) dan menghapus (deleteMessage) pesannya sendiri. Pesan bot di grup tidak dienkripsi end-to-end.

my_chat_member

Saat bot ditambahkan ke atau dikeluarkan dari grup atau channel, bot menerima update my_chat_member berisi chat, from (yang menambahkan atau mengeluarkan), date, old_chat_member, dan new_chat_member (dengan status seperti member, administrator, atau left).

getChat

Mengembalikan Chat: id, type (private, group, atau channel), dan title, username, atau first_name sesuai jenisnya. Bot harus menjadi anggota chat itu.

ParameterTipeWajibKeterangan
chat_idStringYaID pengguna, ID grup, ID channel, atau @username channel publik.
12

Bot di channel

Admin yang boleh menambah admin bisa menambahkan bot lewat Info channel → Tambah bot sebagai admin. Bot menjadi admin yang bisa mengirim, mengedit, dan menghapus post, dan bisa dikeluarkan dengan Keluarkan bot di daftar admin.

  • chat.type bernilai "channel". chat_id boleh berupa ID channel atau "@username" untuk channel publik.
  • message_id berupa string.
  • sendMessage, sendPhoto, sendDocument, sendVideo, sendAudio, dan sendVoice memposting atas nama channel.
  • editMessageText, editMessageCaption, dan deleteMessage bekerja pada post channel.
  • Post dari admin lain dikirim ke bot sebagai update channel_post (objek Message).
  • Tombol di post channel belum didukung.
13

Mode inline

Dengan mode inline, pengguna mengetik @username_bot kata kunci di chat mana pun (chat pribadi, grup, atau chat bot) dan memilih hasil dari bot tanpa membuka chat bot. Nyalakan dengan /setinline di @makebot; teks yang kamu isi tampil sebagai petunjuk di kolom ketik.

Setiap kali pengguna mengetik, bot menerima update inline_query berisi id, from, query, dan offset. Jawab dalam sekitar 6 detik dengan answerInlineQuery; setelah itu pengguna melihat bahwa bot tidak menjawab.

answerInlineQuery

Mengembalikan true. Saat ini hanya hasil bertipe article yang didukung.

ParameterTipeWajibKeterangan
inline_query_idStringYaid dari InlineQuery.
resultsArray of InlineQueryResultArticleYaHasil yang ditampilkan.
next_offsetStringTidakDikirim balik sebagai offset saat pengguna menekan Muat lagi. Kosong berarti tidak ada hasil lagi.

InlineQueryResultArticle

FieldTipeKeterangan
typeStringSelalu "article".
idStringID unik hasil, maksimal 64 byte.
titleStringJudul hasil (ditebalkan di daftar).
descriptionStringOpsional. Teks pendek di bawah judul.
input_message_contentObjectmessage_text (maksimal 4096 karakter) dan parse_mode opsional: teks yang dikirim saat hasil dipilih.
// update.inline_query: { id, from, query, offset }
await call("answerInlineQuery", {
  inline_query_id: update.inline_query.id,
  results: [
    {
      type: "article",
      id: "kurs-usd",
      title: "Kurs USD hari ini",
      description: "1 USD = Rp16.250",
      input_message_content: { message_text: "<b>1 USD</b> = Rp16.250", parse_mode: "HTML" },
    },
  ],
  next_offset: "",
});

Saat pengguna memilih hasil, bot menerima update chosen_inline_result berisi result_id, from, dan query. Teks yang dipilih dikirim oleh aplikasi pengguna sebagai pesan pengguna sendiri dengan tanda "via @username_bot". Di chat pribadi dan grup, pesan itu tetap terenkripsi end-to-end, jadi bot tidak menerima isinya kecuali pesan itu memang ditujukan kepadanya.

Butuh bantuan?

Tanya @makebot di Makechat, atau hubungi tim kami.

Hubungi dukungan Make ↗