← Blog
Artikel

Bot Telegram Peringatan Dini Cuaca dan Gempa BMKG dengan n8n

Tutorial membuat bot Telegram yang mengirim peringatan dini cuaca dan info gempa BMKG secara otomatis memakai n8n dan API Indonesia, lengkap dengan kode anti pesan ganda dan hitungan biaya.

Musim hujan sudah mulai, dan banyak tim operasional (logistik, properti, sekolah, kantor cabang) ingin tahu lebih cepat kalau ada hujan lebat, angin kencang, atau gempa di wilayah mereka, tanpa harus membuka situs BMKG berkali-kali sehari.

Tutorial ini membuat bot Telegram yang mengirim notifikasi peringatan dini cuaca dan gempa dari data BMKG, memakai n8n dan API Indonesia. Tidak perlu server sendiri kalau Anda memakai n8n Cloud, dan totalnya cuma lima node.

Penting: bot ini untuk notifikasi operasional dan dashboard, bukan pengganti sistem peringatan resmi. Untuk keselamatan jiwa, ikuti kanal resmi BMKG (InaTEWS, aplikasi Info BMKG) dan arahan BPBD setempat.

Data yang dipakai

Peringatan dini cuaca (GET /api/v1/peringatan-dini) berisi peringatan aktif dari BMKG dalam format CAP: jenis kejadian, provinsi, daftar kecamatan terdampak, tingkat keparahan, dan waktu berakhir. Bisa difilter dengan ?provinsi=.

{
  "id": "warn_2-49-0-1-360-0-2026-10-24-17-31-005",
  "event": "Hujan Lebat disertai Petir",
  "province": "Jakarta",
  "area": "PADEMANGAN, PANCORAN, TANJUNG PRIOK, TEBET",
  "headline": "Hujan Lebat disertai Petir di Jakarta",
  "severity": "Moderate",
  "urgency": "Expected",
  "expires": "25 October 2026, 00:44 WIB",
  "link": "https://www.bmkg.go.id/alerts/nowcast/id/CJK20261024005_alert.xml",
  "source": "BMKG-CAP"
}

Gempa punya dua endpoint: GET /api/v1/gempa/terkini (gempa terbaru) dan GET /api/v1/gempa/dirasakan (gempa yang dirasakan, lengkap dengan daerah yang merasakan dan skala MMI). Keduanya bersumber dari BMKG dan disinkronkan tiap jam.

{
  "id": "2026-10-22T10-57-49-00-00-5-2-102-14-BT",
  "datetime": "2026-10-22T10:57:49+00:00",
  "magnitude": 5.2,
  "depth_km": 120,
  "lat": -3.11,
  "lng": 102.14,
  "region": "Pusat gempa berada di darat 6 km BaratLaut Lebong",
  "is_felt": 1,
  "felt_areas": "III Kota Bengkulu, II - III Curup, III Arga Makmur",
  "source": "BMKG"
}

Karena data gempa disinkronkan tiap jam, notifikasi bisa terlambat sampai sekitar satu jam. Untuk laporan harian, dashboard, atau pengecekan kondisi cabang itu cukup. Untuk respons darurat, tidak.

Yang Anda butuhkan

  1. API key API Indonesia. Daftar di dashboard.apiindonesia.id. Akun baru dapat bonus 3.000 kredit (sekitar 1.500 request).
  2. n8n, Cloud atau self-hosted.
  3. Bot Telegram. Buat lewat @BotFather, simpan token-nya, dan catat chat ID grup tujuan.

Alur workflow

Schedule Trigger (tiap 15 menit)
  → HTTP Request: GET /api/v1/peringatan-dini?provinsi=Jakarta
  → Code: buang peringatan yang sudah pernah dikirim
  → Telegram: kirim pesan

Untuk gempa, buat cabang kedua dari trigger yang sama dengan HTTP Request ke /api/v1/gempa/dirasakan dan filter magnitudo.

1. Schedule Trigger

Pilih interval Minutes, nilai 15. Peringatan dini BMKG biasanya berlaku beberapa jam, jadi 15 menit sudah cukup cepat tanpa boros request.

2. HTTP Request: peringatan dini

  • Method: GET
  • URL: https://use.apiindonesia.id/api/v1/peringatan-dini
  • Query: provinsi = Jakarta (ganti dengan provinsi Anda, sesuai penamaan BMKG)
  • Authentication: Generic Credential, Header Auth, name x-api-key, value API key Anda

Alternatifnya, pasang community node API Indonesia untuk n8n (n8n-nodes-api-indonesia). Node itu sudah punya resource Early Warning dan Earthquake, jadi Anda tidak perlu menulis URL dan header sendiri.

3. Code: kirim hanya yang baru

Tanpa langkah ini, peringatan yang sama akan terkirim tiap 15 menit sampai kedaluwarsa. Simpan ID yang sudah dikirim di static data workflow:

// Code node, mode: Run Once for All Items
const seen = $getWorkflowStaticData('global');
seen.ids = seen.ids || [];

const warnings = $input.first().json.data || [];
const fresh = warnings.filter((w) => !seen.ids.includes(w.id));

seen.ids = [...seen.ids, ...fresh.map((w) => w.id)].slice(-500);

return fresh.map((w) => ({
  json: {
    text:
      `⚠️ ${w.headline}\n` +
      `Wilayah: ${w.area}\n` +
      `Tingkat: ${w.severity} · Berlaku sampai ${w.expires}\n` +
      `Detail: ${w.link}`,
  },
}));

Catatan: static data hanya tersimpan saat workflow berjalan dalam mode aktif (production), bukan saat Anda klik "Test workflow".

4. Telegram

  • Resource: Message, Operation: Send Message
  • Chat ID: ID grup Anda
  • Text: {{ $json.text }}

Aktifkan workflow, selesai. Setiap ada peringatan baru untuk provinsi Anda, grup Telegram langsung dapat pesan.

5. Cabang gempa (opsional)

Tambahkan HTTP Request kedua ke https://use.apiindonesia.id/api/v1/gempa/dirasakan dengan kredensial yang sama, lalu Code node berikut:

const seen = $getWorkflowStaticData('global');
seen.quakes = seen.quakes || [];

const quakes = ($input.first().json.data || [])
  .filter((q) => q.magnitude >= 4.5)
  .filter((q) => !seen.quakes.includes(q.id));

seen.quakes = [...seen.quakes, ...quakes.map((q) => q.id)].slice(-500);

return quakes.map((q) => ({
  json: {
    text:
      `🌏 Gempa M${q.magnitude} (kedalaman ${q.depth_km} km)\n` +
      `${q.region}\n` +
      `Dirasakan: ${q.felt_areas || '-'}\n` +
      `Waktu: ${new Date(q.datetime).toLocaleString('id-ID', { timeZone: 'Asia/Jakarta' })} WIB`,
  },
}));

Kalau ingin hanya gempa di sekitar lokasi Anda, tambahkan filter jarak dari q.lat dan q.lng ke koordinat kantor Anda.

Berapa biayanya?

Workflow ini memanggil API 4 kali per jam per cabang. Dua cabang (cuaca dan gempa) berarti sekitar 192 request per hari, atau 384 kredit (Rp384) per hari. Bonus 3.000 kredit cukup untuk mencoba sekitar seminggu. Untuk jalan terus, paket Pro Rp49.000/bulan (50.000 kredit) cukup untuk dua cabang ini sepanjang bulan dengan sisa kredit untuk produk lain. Kalau ingin lebih hemat, naikkan interval ke 30 menit.

Pengembangan berikutnya

  • Banyak provinsi: hapus parameter provinsi, lalu arahkan pesan ke grup yang berbeda berdasarkan w.province.
  • Gabungkan dengan prakiraan cuaca: API Cuaca untuk ringkasan pagi per kelurahan.
  • Dashboard: simpan setiap peringatan ke Google Sheets atau database untuk laporan bulanan per wilayah.

Referensi lengkap: dokumentasi Peringatan Dini, dokumentasi Gempa, dan halaman produk API Gempa.

FAQ

Dari mana data peringatan dini dan gempa ini berasal? Dari BMKG. Peringatan dini cuaca diambil dari feed CAP (Common Alerting Protocol) BMKG, dan data gempa dari feed gempa terkini serta gempa dirasakan BMKG.

Seberapa cepat datanya diperbarui? Data gempa disinkronkan tiap jam, dan peringatan dini cuaca juga diperbarui berkala tiap jam. Jadi bot ini cocok untuk notifikasi operasional, bukan peringatan darurat.

Apakah bisa tanpa coding? Hampir. Selain dua Code node kecil untuk mencegah pesan ganda, semuanya diatur lewat antarmuka n8n. Dengan community node n8n-nodes-api-indonesia, Anda juga tidak perlu menulis URL API.

Berapa biaya menjalankan bot ini? Dengan interval 15 menit dan dua cabang, sekitar 384 kredit (Rp384) per hari. Paket Pro Rp49.000/bulan sudah cukup.

Apakah bisa dikirim ke WhatsApp, bukan Telegram? Bisa. Ganti node Telegram dengan node WhatsApp Business Cloud atau penyedia WhatsApp API yang Anda pakai. Bagian ambil data dan filter tetap sama.

Mulai Sekarang

Mulai Integrasi
Hari Ini

Daftar gratis dan dapatkan bonus 3.000 kredit (Rp3.000) setelah email diverifikasi, ambil API key, lalu langsung call endpoint pertama Anda. Tanpa kartu kredit, tanpa proses approval yang ribet.

Visualisasi gelombang titik