/v1/earthquake/latest cache 60 detikSatu gempa terbaru: magnitudo, kedalaman, koordinat, wilayah, potensi tsunami, laporan dirasakan, dan URL shakemap. Waktu dalam UTC.
/v1/earthquake/latestSetiap contoh di halaman ini dapat dijalankan langsung ke API.
Response berhasil selalu memuat data, meta, dan attribution.
{
"data": { "magnitude": 5.4, "region": "18 km TimurLaut Pekalongan" },
"meta": { "fetched_at": "2026-02-16T08:30:00Z", "cache_ttl": 60 },
"attribution": "BMKG (Badan Meteorologi, Klimatologi, dan Geofisika)"
}Response gagal memuat error, message, dan status.
{
"error": "not_found",
"message": "Weather data not available for ADM4 code '99.99.99.9999'.",
"status": 404
}| Status | Arti |
|---|---|
| 200 | Berhasil |
| 400 | Format argumen salah |
| 404 | Tidak ada data untuk kode itu |
| 422 | Parameter wajib tidak ada atau di luar rentang |
| 429 | Rate limit terlampaui. Coba lagi setelah satu menit |
| 503 | BMKG tidak terjangkau, atau server ini mencapai batas request-nya ke BMKG |
BMKG memperbarui datanya pada selang tetap. Setiap response di-cache selama datanya masih berlaku, di server ini dan di CDN di depannya. Request yang lebih sering dari masa cache menerima jawaban yang sama.
Untuk kebutuhan yang lebih besar tersedia panduan menjalankan instance sendiri.
/v1/earthquake/latest cache 60 detikSatu gempa terbaru: magnitudo, kedalaman, koordinat, wilayah, potensi tsunami, laporan dirasakan, dan URL shakemap. Waktu dalam UTC.
/v1/earthquake/latest/v1/earthquake/recent cache 5 menit15 gempa terakhir bermagnitudo 5,0 ke atas, dari yang terbaru.
/v1/earthquake/recent/v1/earthquake/felt cache 5 menit15 gempa terakhir yang dilaporkan dirasakan, termasuk gempa kecil, beserta tempat dan intensitasnya.
/v1/earthquake/felt/v1/earthquake/nearby cache 5 menitGempa dari daftar terkini dan dirasakan dalam radius tertentu dari satu titik, dari yang terdekat, dengan distance_km. Daftar kosong berarti tidak ada di antara catatan terbaru BMKG, bukan tidak pernah ada.
lat | wajib | Lintang, -90 sampai 90 |
lon | wajib | Bujur, -180 sampai 180 |
radius_km | opsional | Radius pencarian dalam km, default 100 |
/v1/earthquake/nearby?lat=-6.2&lon=106.8&radius_km=300/v1/weather/{adm4_code} cache 15 menitPrakiraan satu desa atau kelurahan untuk tiga hari, tiap 3 jam: suhu, kelembapan, cuaca dalam bahasa Indonesia dan Inggris, angin, dan tutupan awan. visibility_m dapat bernilai null.
adm4_code | di path | Kode desa dengan pola 2.2.2.4 digit, misalnya 31.74.04.1006 |
/v1/weather/31.74.04.1006/v1/weather/{adm4_code}/current cache 15 menitEntri prakiraan yang paling dekat dengan waktu sekarang untuk satu desa. Ini prakiraan BMKG untuk slot 3 jam berjalan, bukan pengamatan stasiun.
adm4_code | di path | Kode desa dengan pola 2.2.2.4 digit, misalnya 31.74.04.1006 |
/v1/weather/31.74.04.1006/current/v1/nowcast cache 2 menitProvinsi yang sedang punya peringatan dini cuaca, masing-masing dengan kode untuk endpoint rinciannya. Daftar kosong berarti tidak ada peringatan aktif.
lang | opsional | id (default) atau en |
/v1/nowcast/v1/nowcast/warnings cache 2 menitSemua peringatan aktif secara lengkap dalam satu request, masing-masing dengan wilayah terdampak sebagai poligon. meta.missing memuat kode peringatan yang rinciannya tidak terbaca dari BMKG, supaya daftar yang pendek tidak dikira lengkap.
lang | opsional | id (default) atau en |
/v1/nowcast/warnings/v1/nowcast/{alert_code} cache 2 menitSatu peringatan secara lengkap: kejadian, tingkat keparahan, masa berlaku, uraian, URL infografik, dan wilayah terdampak sebagai poligon. Hanya kode dari daftar aktif yang tersedia; kode lain menghasilkan 404.
alert_code | di path | Kode dari /v1/nowcast |
lang | opsional | id (default) atau en |
/v1/nowcast/{alert_code}/v1/nowcast/check cache 2 menitPeringatan aktif yang teksnya menyebut nama tempat. has_warnings bernilai false berarti tidak ada peringatan aktif yang menyebutnya, bukan prakiraan cuaca baik.
location | wajib | Nama kecamatan, kota, atau kabupaten seperti ditulis BMKG |
lang | opsional | id (default) atau en |
/v1/nowcast/check?location=Jakarta/v1/wilayah/search cache 24 jamWilayah yang namanya memuat kata pencarian, di semua tingkat, dengan kode, tingkat, dan path lengkapnya.
q | wajib | Bagian dari nama, 2 sampai 100 karakter |
limit | opsional | 1 sampai 100, default 50 |
/v1/wilayah/search?q=tebet&limit=20/v1/wilayah/provinces cache 24 jamSemua provinsi dengan kode dua digit.
/v1/wilayah/provinces/v1/wilayah/districts cache 24 jamKabupaten dan kota dalam satu provinsi.
province | wajib | Kode provinsi dua digit, misalnya 31 |
/v1/wilayah/districts?province=31/v1/wilayah/subdistricts cache 24 jamKecamatan dalam satu kabupaten atau kota.
district | wajib | Kode kabupaten atau kota, misalnya 31.74 |
/v1/wilayah/subdistricts?district=31.74/v1/wilayah/villages cache 24 jamDesa dan kelurahan dalam satu kecamatan. Kodenya adalah kode adm4 yang dipakai endpoint cuaca.
subdistrict | wajib | Kode kecamatan, misalnya 31.74.04 |
/v1/wilayah/villages?subdistrict=31.74.04Endpoint rincian peringatan mengembalikan tiap wilayah terdampak sebagai poligon. Ada dua hal yang sering keliru:
Peta di situs ini memisahkannya dengan cara berikut:
// One area's polygon is a flat list of [lat, lon] points holding several
// closed rings back to back. A ring ends when a point returns to the ring's
// start, or when the next point is more than 10 km away.
function splitRings(coords) {
const rings = [];
let start = coords[0];
let ring = [coords[0]];
for (let i = 1; i < coords.length; i++) {
const point = coords[i];
if (ring.length >= 4 && distanceKm(ring.at(-1), point) > 10) {
rings.push([...ring, ring[0]]);
start = point;
ring = [point];
continue;
}
ring.push(point);
if (samePoint(point, start) && ring.length >= 4) {
rings.push(ring);
ring = [];
if (i + 1 < coords.length) {
start = coords[i + 1];
ring = [start];
i++;
}
}
}
if (ring.length >= 4) rings.push([...ring, ring[0]]);
return rings;
}
// Real boundaries have short edges. A ring with an edge over 20 km joins
// two distant clusters and is dropped.
const drawable = splitRings(area.polygon).filter((ring) =>
ring.every((point, i) => i === 0 || distanceKm(ring[i - 1], point) <= 20)
);