# ISPU Indonesia Wrapper Node.js ESM untuk data **kualitas udara resmi Indonesia** (ISPU) dari Kementerian Lingkungan Hidup / BPLH. Sumber: [ispu.kemenlh.go.id](https://ispu.kemenlh.go.id) · Endpoint JSON publik · **tanpa API key** Token JWT diambil otomatis dari bundle frontend website. Cocok untuk bot, dashboard, notifikasi, atau CLI. --- ## Fitur - Semua stasiun AQMS realtime (~117+) - Cari by kota / provinsi / nama stasiun - Ranking ISPU (nasional atau per provinsi/kota) - Detail stasiun + histori 24 jam - Ringkasan nasional (hitung kategori, top polusi/bersih) - Daftar provinsi + rata-rata ISPU - Metadata lengkap: alamat, lat/lon, parameter kritis, konsentrasi, kategori ISPU (Permen LHK 14/2020) - Cache in-memory, auto-refresh token, zero dependency - Dual mode: **module** + **CLI** --- ## Install ```bash # Node.js 18+ (native fetch) # cukup copy ispu.js — tanpa npm install ``` --- ## Module ```js import ISPU, { ispuCategory } from './ispu.js'; const aq = new ISPU(); // Ringkasan nasional const summary = await aq.summary(); // Cari const jkt = await aq.search('jakarta'); // Ranking const rank = await aq.ranking({ limit: 10, provinsi: 'Kalimantan Tengah' }); // Filter const jabar = await aq.byProvinsi('Jawa Barat'); const bdg = await aq.byKota('Bandung'); // Detail + histori 24 jam const dki1 = await aq.station('DKI1'); // Semua stasiun / daftar provinsi const all = await aq.all(); const prov = await aq.listProvinsi(); // Helper kategori console.log(ispuCategory(112)); // → { code: 3, name: 'Tidak Sehat', color: '#ffcc00', ... } ``` ### Opsi konstruktor ```js new ISPU({ token: '...', // paksa token (skip auto-fetch) autoToken: true, // default: ambil JWT dari frontend timeout: 20_000, // ms cacheTtl: 300_000, // cache data stasiun (5 menit) tokenTtl: 6 * 3600_000, // cache token (6 jam) }); ``` Env opsional: `ISPU_TOKEN=...` --- ## CLI ```bash node ispu.js summary node ispu.js stations node ispu.js search --q=surabaya node ispu.js ranking --limit=15 --provinsi="Jawa Barat" node ispu.js ranking --kota=Palembang node ispu.js provinsi --name="DKI Jakarta" node ispu.js kota --name=Medan node ispu.js station --id=PALANGKARAYA node ispu.js list-provinsi ``` Output selalu JSON ke stdout (siap di-pipe / parse). --- ## Struktur data stasiun ```json { "id": "DKI1", "nama": "DKI 1 Bundaran HI", "kota": "Jakarta", "provinsi": "DKI Jakarta", "alamat": "...", "lat": -6.19, "lon": 106.82, "ispu": 112, "kategori": "Tidak Sehat", "kategoriDetail": { "code": 3, "name": "Tidak Sehat", "nameEn": "Unhealthy", "color": "#ffcc00", "range": "101-200", "advice": "Kurangi aktivitas di luar..." }, "parameterKritis": "PM2.5", "konsentrasi": { "pm10": ..., "pm25": ..., "so2": ..., "co": ..., "o3": ..., "no2": ..., "hc": ... }, "ispuPerParameter": { "pm10": 70, "pm25": 112, ... }, "waktu": "2026-10-06 18:00:00", "tipe": "INTEGRASI" } ``` ### Skala ISPU (Permen LHK 14/2020) | ISPU | Kategori | Warna | |--------|---------------------|-----------| | 0–50 | Baik | `#00e400` | | 51–100 | Sedang | `#0066ff` | | 101–200| Tidak Sehat | `#ffcc00` | | 201–300| Sangat Tidak Sehat | `#ff0000` | | ≥301 | Berbahaya | `#000000` | --- ## example full output check [example-output.json](https://code.vyrgo.cyou/shanmolvyr/ispu/example-output.json) ## Catatan - Token diambil otomatis dari `main.*.js` di situs ISPU. Jika 401, wrapper refresh sekali; fallback token bawaan tetap ada. - Beberapa stasiun tipe **INTEGRASI** (mis. DKI1–DKI5) sering menampilkan `konsentrasi: 0` di list API, sementara nilai ISPU ada di `ispu` / `ispuPerParameter` — ini perilaku data sumber. - Data milik pemerintah; gunakan wajar, jangan flood request. Cache default 5 menit sudah cukup untuk bot/dashboard. --- ## License MIT — bebas dipakai untuk proyek pribadi maupun komersial.