← Blog
🕌

Aplikasi Pengingat Sholat Tanpa Biaya API

Tutorial · 5 menit baca

Jadwal sholat dan hari libur gratis selamanya — tanpa API key. Bangun aplikasi lengkap tanpa mengeluarkan satu rupiah pun untuk API.

Dua endpoint di API.MY.ID gratis sepenuhnya dan tidak butuh API key: jadwal sholat dan hari libur nasional. Tidak ada kuota, tidak ada poin, tidak ada pendaftaran. Artikel ini membangun aplikasi pengingat sholat sederhana di atasnya.

Panggilan pertama

Tanpa header, tanpa autentikasi — cukup satu GET:

curl "https://v1.api.my.id/sholat?city=jakarta"
{
  "status": "success",
  "data": {
    "city": { "slug": "jakarta", "name": "Jakarta" },
    "date": "2026-07-09",
    "timezone": "WIB",
    "jadwal": {
      "imsak": "04:31", "subuh": "04:41", "terbit": "06:04", "dhuha": "06:28",
      "dzuhur": "12:00", "ashar": "15:20", "maghrib": "17:53", "isya": "19:06"
    }
  }
}

Bagaimana waktunya dihitung

Waktu sholat bukan data yang disimpan di tabel — ia dihitung dari posisi matahari untuk koordinat dan tanggal yang diminta. Kami memakai konvensi sudut yang lazim dipakai Kemenag: Subuh pada −20°, Isya pada −18°, terbit dan maghrib pada −0,833° (memperhitungkan refraksi atmosfer dan radius matahari), dan Ashar dengan metode Syafi'i. Ihtiyat +2 menit ditambahkan pada Dzuhur dan Maghrib sebagai margin kehati-hatian.

Konsekuensi praktisnya: 54 kota didukung dengan zona waktu yang benar (WIB, WITA, WIT), dan Anda bisa meminta tanggal berapa pun — kemarin, hari ini, atau Ramadhan tahun depan.

Menjadwalkan notifikasi

Pola yang benar: ambil jadwal sekali sehari, lalu jadwalkan notifikasi lokal. Jangan polling API setiap menit — jadwalnya tidak berubah.

const WAKTU = ['subuh', 'dzuhur', 'ashar', 'maghrib', 'isya'];

async function jadwalkanHariIni(kota = 'jakarta') {
  const res = await fetch(`https://v1.api.my.id/sholat?city=${kota}`);
  const { data } = await res.json();

  for (const nama of WAKTU) {
    const [jam, menit] = data.jadwal[nama].split(':').map(Number);
    const waktu = new Date();
    waktu.setHours(jam, menit, 0, 0);

    const selisih = waktu - Date.now();
    if (selisih <= 0) continue;             // sudah lewat hari ini

    setTimeout(() => {
      new Notification(`Waktu ${nama}`, {
        body: `${data.jadwal[nama]} ${data.timezone} — ${data.city.name}`,
      });
    }, selisih);
  }
}

// jalankan saat aplikasi dibuka, dan setiap tengah malam
jadwalkanHariIni();
💡 Untuk aplikasi produksi, gunakan API notifikasi platform (Service Worker di web, WorkManager di Android, UNUserNotificationCenter di iOS) agar pengingat tetap jalan saat aplikasi ditutup. setTimeout di atas hanya untuk menunjukkan idenya.

Ramadhan: imsak dan buka puasa

Untuk timer sahur dan berbuka, dua field yang Anda butuhkan sudah ada di respons yang sama: imsak dan maghrib. Karena Anda bisa meminta tanggal berapa pun, seluruh kalender Ramadhan bisa diambil sekali dan disimpan lokal:

async function kalenderRamadhan(kota, mulai, hari = 30) {
  const jadwal = [];
  for (let i = 0; i < hari; i++) {
    const t = new Date(mulai);
    t.setDate(t.getDate() + i);
    const tgl = t.toISOString().slice(0, 10);

    const res = await fetch(`https://v1.api.my.id/sholat?city=${kota}&date=${tgl}`);
    const { data } = await res.json();
    jadwal.push({ tanggal: tgl, imsak: data.jadwal.imsak, buka: data.jadwal.maghrib });
  }
  return jadwal;   // simpan di localStorage / SQLite
}

Bonus: kalender hari libur

Endpoint gratis kedua melengkapi aplikasi kalender apa pun. Ia mengembalikan libur nasional dan cuti bersama sesuai SKB 3 Menteri, dengan flag yang membedakan keduanya:

curl "https://v1.api.my.id/holidays/upcoming?limit=3"

Karena keduanya gratis dan tanpa key, seluruh aplikasi ini bisa berjalan tanpa backend sama sekali — panggil langsung dari klien. Ini satu-satunya kasus di mana kami menyarankan itu, justru karena tidak ada key yang bisa bocor.

Siap mencoba?

Buat akun gratis dan dapatkan API key — 5.000 hits gratis per bulan, dan dua endpoint yang tak butuh key sama sekali.