Quickstart
Connect an MCP client or send a first request. No key, no sign-up.
claude mcp add --transport http refnusa https://refnusa.dev/mcphttps://refnusa.dev{
"date": "2026-08-17",
"is_holiday": true,
"name": "Proklamasi Kemerdekaan",
"type": "libur_nasional",
"source_instrument": "Keputusan Bersama Menteri Agama, Menteri Ketenagakerjaan, dan Menteri Pendayagunaan Aparatur Negara dan Reformasi Birokrasi Republik Indonesia Nomor 1497 Tahun 2025, Nomor 2 Tahun 2025, dan Nomor 5 Tahun 2025 tentang Hari Libur Nasional dan Cuti Bersama Tahun 2026",
"effective_date": "2025-09-19",
"source_url": "https://www.kemenkopmk.go.id/sites/default/files/pengumuman/2025-09/SKB%20Libur%20Nasional%20dan%20Cuti%20Bersama%20Tahun%202026.pdf"
}Datasets
Coverage of this build. A dataset that is not loaded yet answers with a plain 404 that says so, never with a guessed figure.
| Dataset | Source | Coverage | Status |
|---|---|---|---|
Public holidays and cuti bersama holidays | SKB 3 Menteri, one decree per year; each row names its ownFull sourceSKB 3 Menteri, one decree per year; each row names its own | Complete | Loaded |
Provincial minimum wage (UMP) wages_ump | Keputusan Gubernur per province for 2026 (each row names its own); BPS yearly tables for 1997 to 2025 and for any 2026 province without a decree on fileFull sourceKeputusan Gubernur per province for 2026 (each row names its own); BPS yearly tables for 1997 to 2025 and for any 2026 province without a decree on file | 38 of 38 provinces (29 decrees, 9 BPS) | Loaded |
Regency and city minimum wage (UMK) wages_umk | Keputusan Gubernur per regency/city; each row names its ownFull sourceKeputusan Gubernur per regency/city; each row names its own | 139 of 514 kabupaten/kota | Partial |
Administrative region codes, province to kelurahan wilayah | Kepmendagri No 300.2.2-2138 Tahun 2025 as stated in the header of cahyadsn/wilayah db/wilayah.sql (the repository README cites No 300.2.2-2430 Tahun 2025), commit 55a496d, MITFull sourceKepmendagri No 300.2.2-2138 Tahun 2025 as stated in the header of cahyadsn/wilayah db/wilayah.sql (the repository README cites No 300.2.2-2430 Tahun 2025), commit 55a496d, MIT | Complete | Loaded |
Postal codes per kelurahan and desa postal_codes | cahyadsn/wilayah_kodepos json/wilayah_kodepos.json, commit ba84971, MITFull sourcecahyadsn/wilayah_kodepos json/wilayah_kodepos.json, commit ba84971, MIT | Complete | Loaded |
PPh 21 effective average rates (TER) tax_pph21_ter | Peraturan Pemerintah Nomor 58 Tahun 2023 tentang Tarif Pemotongan Pajak Penghasilan Pasal 21 atas Penghasilan Sehubungan dengan Pekerjaan, Jasa, atau Kegiatan Wajib Pajak Orang Pribadi, Lampiran huruf A, B, dan C (Tarif Efektif Bulanan)Full sourcePeraturan Pemerintah Nomor 58 Tahun 2023 tentang Tarif Pemotongan Pajak Penghasilan Pasal 21 atas Penghasilan Sehubungan dengan Pekerjaan, Jasa, atau Kegiatan Wajib Pajak Orang Pribadi, Lampiran huruf A, B, dan C (Tarif Efektif Bulanan) | Complete | Loaded |
Non-taxable income (PTKP) tax_ptkp | Peraturan Menteri Keuangan Nomor 101/PMK.010/2016 tentang Penyesuaian Besarnya Penghasilan Tidak Kena PajakFull sourcePeraturan Menteri Keuangan Nomor 101/PMK.010/2016 tentang Penyesuaian Besarnya Penghasilan Tidak Kena Pajak | Complete | Loaded |
Prayer times, computed prayer_times | Subuh at 20 degrees as stated by the Dirjen Bimas Islam, Kementerian Agama (kemenag.go.id, 2020-12-21). Isya at 18 degrees, Ashar at shadow ratio 1 and ihtiyat 2 minutes are labelled estimates commonly published for Indonesia. Checked against the Bimas Islam jadwal shalat for Kota Jakarta: within 1 minute on six dates in February and March 2026.Full sourceSubuh at 20 degrees as stated by the Dirjen Bimas Islam, Kementerian Agama (kemenag.go.id, 2020-12-21). Isya at 18 degrees, Ashar at shadow ratio 1 and ihtiyat 2 minutes are labelled estimates commonly published for Indonesia. Checked against the Bimas Islam jadwal shalat for Kota Jakarta: within 1 minute on six dates in February and March 2026. | Complete | Loaded |
Vehicle plate prefixes plate_prefixes | Peraturan Kepolisian Negara Republik Indonesia Nomor 7 Tahun 2021 tentang Registrasi dan Identifikasi Kendaraan Bermotor, Lampiran huruf A (Penentuan kode wilayah berdasarkan wilayah Regident Ranmor)Full sourcePeraturan Kepolisian Negara Republik Indonesia Nomor 7 Tahun 2021 tentang Registrasi dan Identifikasi Kendaraan Bermotor, Lampiran huruf A (Penentuan kode wilayah berdasarkan wilayah Regident Ranmor) | Complete | Loaded |
Bank codes (Sandi Bank), OJK list bank_codes | OJK, List of Commercial Banks and Sharia Banks Head Offices - June 2026 (sheet "Daftar Bank Umum", column Sandi Bank)Full sourceOJK, List of Commercial Banks and Sharia Banks Head Offices - June 2026 (sheet "Daftar Bank Umum", column Sandi Bank) | Complete | Loaded |
Subsidised and assigned fuel prices (BBM) fuel_prices | Keputusan Menteri ESDM Nomor 218.K/MG.01/MEM.M/2022 tentang Harga Jual Eceran Jenis Bahan Bakar Minyak Tertentu dan Jenis Bahan Bakar Minyak Khusus PenugasanFull sourceKeputusan Menteri ESDM Nomor 218.K/MG.01/MEM.M/2022 tentang Harga Jual Eceran Jenis Bahan Bakar Minyak Tertentu dan Jenis Bahan Bakar Minyak Khusus Penugasan | Subsidised and assigned fuels only | Partial |
Passport and visa kunjungan fees (Imigrasi PNBP) passport_fees | Peraturan Pemerintah Nomor 45 Tahun 2024 tentang Jenis dan Tarif atas Jenis Penerimaan Negara Bukan Pajak yang Berlaku pada Kementerian Hukum dan Hak Asasi Manusia, Lampiran III (Pelayanan Keimigrasian)Full sourcePeraturan Pemerintah Nomor 45 Tahun 2024 tentang Jenis dan Tarif atas Jenis Penerimaan Negara Bukan Pajak yang Berlaku pada Kementerian Hukum dan Hak Asasi Manusia, Lampiran III (Pelayanan Keimigrasian) | Passport and visa kunjungan rows only | Partial |
Business-field classification (KBLI 2020) kbli | Peraturan Badan Pusat Statistik Nomor 2 Tahun 2020 tentang Klasifikasi Baku Lapangan Usaha Indonesia (KBLI 2020), diundangkan 24 September 2020Full sourcePeraturan Badan Pusat Statistik Nomor 2 Tahun 2020 tentang Klasifikasi Baku Lapangan Usaha Indonesia (KBLI 2020), diundangkan 24 September 2020 | Complete | Loaded |
PPN, bea meterai and tobacco excise rates tax_rates | 3 instruments, named on each rowFull source3 instruments, named on each row | PPN, bea meterai, domestic tobacco excise | Partial |
Ride-hailing motorbike fare zones (ojol) ojol_tariffs | Keputusan Menteri Perhubungan Nomor KP 667 Tahun 2022 tentang Pedoman Perhitungan Biaya Jasa Penggunaan Sepeda Motor yang Digunakan untuk Kepentingan Masyarakat yang Dilakukan dengan Aplikasi, Lampiran IIFull sourceKeputusan Menteri Perhubungan Nomor KP 667 Tahun 2022 tentang Pedoman Perhitungan Biaya Jasa Penggunaan Sepeda Motor yang Digunakan untuk Kepentingan Masyarakat yang Dilakukan dengan Aplikasi, Lampiran II | 2022 zone table; 2026 decision not found | Partial |
Zakat fitrah and nisab, BAZNAS 2026 zakat | 2 instruments, named on each rowFull source2 instruments, named on each row | Fitrah and penghasilan nisab only | Partial |
Retail price ceilings: rice and LPG 3 kg (HET) het_prices | 2 instruments, named on each rowFull source2 instruments, named on each row | Rice by wilayah; LPG 3 kg in Jawa Timur only | Partial |
Staple food prices per province (PIHPS Nasional) food_prices | PIHPS Nasional, Bank IndonesiaFull sourcePIHPS Nasional, Bank Indonesia | 31 staple items; latest day in two markets, monthly series since May 2017 (traditional markets) | Partial |
BPJS contribution rates (JHT, JP, JKK, JKM, JKP, JKN) bpjs_rates | PP 46/2015, PP 45/2015, PP 44/2015, PP 6/2025, Perpres 64/2020 and Perpres 59/2024; each row names its ownFull sourcePP 46/2015, PP 45/2015, PP 44/2015, PP 6/2025, Perpres 64/2020 and Perpres 59/2024; each row names its own | Complete | Loaded |
Regional statistics (BPS): economy, employment and food, plus population and life expectancy stats | BPS statistics tables, one per indicator (see /v1/stats/indicators)Full sourceBPS statistics tables, one per indicator (see /v1/stats/indicators) | 60 BPS indicators; years differ by indicator | Partial |
FAOSTAT Indonesia: food security indicators and staple supply (FAO) faostat_idn | FAOSTAT bulk files: Suite of Food Security Indicators (FS) and Food Balances 2010- (FBS), area code 101Full sourceFAOSTAT bulk files: Suite of Food Security Indicators (FS) and Food Balances 2010- (FBS), area code 101 | Selected FAO series; FAO methodology | Partial |
REST reference
Responses are JSON and need no key. Each client may send 60 requests a minute; past that the API answers 429, see Limits and errors.
GET /v1/datasets
Coverage and status of every dataset: status, row count, source instrument, effective date, publisher, official source URL, last check, data period, cadence, maximum age, next expected update, and the catalogue page. The licence, caveat and fallback fields are Indonesian text.
No parameters.
curl "https://refnusa.dev/v1/datasets"await fetch("https://refnusa.dev/v1/datasets").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/datasets").json(){
"datasets": [
{
"dataset": "holidays",
"status": "loaded",
"row_count": 51,
"source_instrument": "SKB 3 Menteri, one decree per year; each row names its own",
"effective_date": "2026-09-15",
"note": "Years loaded: 2026, 2027.",
"title": "Hari libur nasional dan cuti bersama",
"publisher": "Menteri Agama, Menteri Ketenagakerjaan dan Menteri PANRB (SKB 3 Menteri)",
"source_url": "https://www.kemenkopmk.go.id/sites/default/files/pengumuman/2025-09/SKB%20Libur%20Nasional%20dan%20Cuti%20Bersama%20Tahun%202026.pdf",
"source_label": "Sumber resmi",
"licence": "Kemenko PMK: beranda situs tidak memuat kata hak cipta atau lisensi. Kemenag: kaki beranda menyatakan hak cipta dilindungi, tanpa lisensi (dicek 14 Oktober 2026).",
"cadence": "yearly",
"cadence_note": "SKB terbit setahun sekali untuk tahun berikutnya: SKB 2026 bertanggal 19 September 2025 dan SKB 2027 bertanggal 15 September 2026.",
"max_age_days": 400,
"next_expected": null,
"caveat": "Hanya tahun 2026 dan 2027 yang dimuat; revisi SKB di tengah tahun baru masuk setelah dokumennya kami baca.",
"fallback": "Tahun yang SKB-nya belum terbit tidak ditampilkan; tidak ada tanggal perkiraan. Bila SKB direvisi, tanggal baru dicatat di umpan perubahan.",
"catalog_path": "/data/hari-libur-nasional/",
"last_checked": "2026-09-23",
"period_start": "2026",
"period_end": "2027"
},
{
"dataset": "wages_ump",
"status": "loaded",
"row_count": 38,
"source_instrument": "Keputusan Gubernur per province for 2026 (each row names its own); BPS yearly tables for 1997 to 2025 and for any 2026 province without a decree on file",
"effective_date": "2026-01-01",
"note": "38 of 38 provinces for 2026: 29 from governor decrees, 9 from BPS tables. History: 1997 to 2026, 30 years loaded.",
"title": "Upah minimum provinsi (UMP)",
"publisher": "Gubernur setiap provinsi; Badan Pusat Statistik untuk tabel tahunan",
"source_url": "https://www.bps.go.id/id/statistics-table/2/MjIwIzI=/upah-minimum-regional-propinsi.html",
"source_label": "Sumber resmi",
"licence": "Keputusan gubernur: peraturan.bpk.go.id menyatakan dokumen hukum di situsnya bersumber dari situs instansi terkait dan tidak mencantumkan lisensi (dicek 14 Oktober 2026). Tabel BPS: Halaman pengembang BPS yang tersimpan tidak memuat pernyataan lisensi atau ketentuan penggunaan, dan ketentuan pusat tidak ditemukan (dicek 14 Oktober 2026). Cuplikan hasil pencarian untuk halaman ketentuan BPS daerah menyebut konten bebas dipakai dengan mencantumkan BPS, tetapi halaman itu belum dibuka.",
"cadence": "yearly",
"cadence_note": "UMP berlaku setiap 1 Januari. Menurut pernyataan Menaker yang dimuat pers (belum dicocokkan dengan teks PP 51/2023), batas pengumuman UMP adalah 21 November.",
"max_age_days": 400,
"next_expected": "2026-11-21",
"caveat": "Angka 1997 sampai 2025 dari tabel BPS tanpa tanggal berlaku; 2026 memakai keputusan gubernur untuk 29 provinsi dan tabel BPS untuk 9.",
"fallback": "Bila keputusan gubernur belum ditemukan, provinsi itu memakai tabel BPS dan diberi label BPS. Tidak ada angka perkiraan.",
"catalog_path": "/data/upah-minimum-provinsi/",
"last_checked": "2026-10-20",
"period_start": "1997",
"period_end": "2026",
"years": [
1997,
1998,
1999,
// 27 more
]
},
{
"dataset": "wages_umk",
"status": "partial",
"row_count": 139,
"source_instrument": "Keputusan Gubernur per regency/city; each row names its own",
"effective_date": "2026-01-01",
"note": "Every kabupaten/kota whose 2026 UMK is confirmed on an official document; regions without one are left out. Regions with no decree row yet but a figure in a BPS provincial table (Nusa Tenggara Timur, Lampung) carry that figure, labelled BPS table; a decree row always wins. Earlier years: 1172 rows in data/umk-history.json, from saved governor decrees, plus regional open-data portal tables (no decree number) for Kalimantan Barat, Banten, Sumatera Selatan, Kalimantan Timur, Kalimantan Tengah and parts of Jawa Tengah.",
"title": "Upah minimum kabupaten/kota (UMK)",
"publisher": "Gubernur setiap provinsi; portal data resmi pemerintah daerah; BPS provinsi",
"source_url": "https://files.jdih.jatimprov.go.id/jdih-prod/uploads/topics/2025kg00350937.pdf",
"source_label": "Sumber resmi",
"licence": "Keputusan gubernur: peraturan.bpk.go.id menyatakan dokumen hukum di situsnya bersumber dari situs instansi terkait dan tidak mencantumkan lisensi (dicek 14 Oktober 2026). Portal data daerah menulis lisensi berbeda per set data (dicek 14 Oktober 2026): Creative Commons Attribution (Penajam Paser Utara, Kutai Timur, Magelang, Kalimantan Barat 2019 dan 2022); tanpa lisensi (Banten, Berau, Kutai Barat); lisensi tidak dinyatakan (Kalimantan Barat 2025, Sumatera Selatan). Portal lain belum diperiksa.",
"cadence": "yearly",
"cadence_note": "UMK berlaku setiap 1 Januari. Menurut pernyataan Menaker yang dimuat pers (belum dicocokkan dengan teks PP 51/2023), batas pengumuman UMK adalah 30 November.",
"max_age_days": 400,
"next_expected": "2026-11-30",
"caveat": "Hanya 139 dari 514 kabupaten/kota punya UMK 2026. Sebagian kabupaten tidak menetapkan UMK; di sana berlaku UMP provinsi.",
"fallback": "Daerah tanpa dokumen sumber dibiarkan kosong. Tidak ada angka perkiraan atau salinan dari daerah lain.",
"catalog_path": "/data/upah-minimum-kabupaten-kota/",
"last_checked": "2026-10-20",
"period_start": "2007",
"period_end": "2026",
"years": [
2007,
2009,
2010,
// 16 more
]
},
// 18 more
]
}GET /v1/holidays
Public holidays (libur nasional) and joint leave days (cuti bersama) for one year, from that year's SKB 3 Menteri decree.
| Name | Type | Required | Description |
|---|---|---|---|
year | integer | Required | Calendar year, for example 2026 |
curl "https://refnusa.dev/v1/holidays?year=2026"await fetch("https://refnusa.dev/v1/holidays?year=2026").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/holidays", params={"year":2026}).json(){
"year": 2026,
"source_url": "https://www.kemenkopmk.go.id/sites/default/files/pengumuman/2025-09/SKB%20Libur%20Nasional%20dan%20Cuti%20Bersama%20Tahun%202026.pdf",
"holidays": [
{
"date": "2026-01-01",
"name": "Tahun Baru 2026 Masehi",
"type": "libur_nasional",
"source_instrument": "Keputusan Bersama Menteri Agama, Menteri Ketenagakerjaan, dan Menteri Pendayagunaan Aparatur Negara dan Reformasi Birokrasi Republik Indonesia Nomor 1497 Tahun 2025, Nomor 2 Tahun 2025, dan Nomor 5 Tahun 2025 tentang Hari Libur Nasional dan Cuti Bersama Tahun 2026",
"effective_date": "2025-09-19"
},
{
"date": "2026-01-16",
"name": "Isra Mikraj Nabi Muhammad S.A.W.",
"type": "libur_nasional",
"source_instrument": "Keputusan Bersama Menteri Agama, Menteri Ketenagakerjaan, dan Menteri Pendayagunaan Aparatur Negara dan Reformasi Birokrasi Republik Indonesia Nomor 1497 Tahun 2025, Nomor 2 Tahun 2025, dan Nomor 5 Tahun 2025 tentang Hari Libur Nasional dan Cuti Bersama Tahun 2026",
"effective_date": "2025-09-19"
},
{
"date": "2026-02-16",
"name": "Tahun Baru Imlek 2577 Kongzili",
"type": "cuti_bersama",
"source_instrument": "Keputusan Bersama Menteri Agama, Menteri Ketenagakerjaan, dan Menteri Pendayagunaan Aparatur Negara dan Reformasi Birokrasi Republik Indonesia Nomor 1497 Tahun 2025, Nomor 2 Tahun 2025, dan Nomor 5 Tahun 2025 tentang Hari Libur Nasional dan Cuti Bersama Tahun 2026",
"effective_date": "2025-09-19"
},
// 22 more
]
}GET /v1/holidays/:date
Whether one date is a public holiday or cuti bersama, with the decree it was checked against. Weekends count only when the decree names them.
| Name | Type | Required | Description |
|---|---|---|---|
date | date | Required | Date in YYYY-MM-DD form |
curl "https://refnusa.dev/v1/holidays/2026-08-17"await fetch("https://refnusa.dev/v1/holidays/2026-08-17").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/holidays/2026-08-17").json(){
"date": "2026-08-17",
"is_holiday": true,
"name": "Proklamasi Kemerdekaan",
"type": "libur_nasional",
"source_instrument": "Keputusan Bersama Menteri Agama, Menteri Ketenagakerjaan, dan Menteri Pendayagunaan Aparatur Negara dan Reformasi Birokrasi Republik Indonesia Nomor 1497 Tahun 2025, Nomor 2 Tahun 2025, dan Nomor 5 Tahun 2025 tentang Hari Libur Nasional dan Cuti Bersama Tahun 2026",
"effective_date": "2025-09-19",
"source_url": "https://www.kemenkopmk.go.id/sites/default/files/pengumuman/2025-09/SKB%20Libur%20Nasional%20dan%20Cuti%20Bersama%20Tahun%202026.pdf"
}GET /v1/wages/ump
Provincial minimum wage (UMP) for one year (default: the newest loaded), all provinces or one province. For 2026, 29 provinces cite the governor decree and 9 the BPS table; 1997 to 2025 rows cite the BPS yearly table (2017 and Jawa Barat 2016: BPS Statistik Indonesia 2018, Tabel 3.2.23).
| Name | Type | Required | Description |
|---|---|---|---|
year | integer | Optional | Calendar year, for example 2026; omit for the newest year loaded |
province_code | string | Optional | Kemendagri province code, optional (two digits like 31) |
curl "https://refnusa.dev/v1/wages/ump?year=2026&province_code=31"await fetch("https://refnusa.dev/v1/wages/ump?year=2026&province_code=31").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/wages/ump", params={"year":2026,"province_code":"31"}).json(){
"year": 2026,
"ump": [
{
"province_code": "31",
"province_name": "DKI Jakarta",
"amount_idr": 5729876,
"source_instrument": "Keputusan Gubernur Nomor 1142 Tahun 2025 tentang Upah Minimum Provinsi Tahun 2026",
"effective_date": "2026-01-01",
"source_url": "https://jdih.jakarta.go.id/dokumen/detail/14763"
}
]
}GET /v1/wages/ump/history
Every loaded year of the provincial minimum wage (UMP) for one province, oldest first, each row with its source (governor decree or BPS table) and URL. 1997 to 2026. Without province_code: the same rows for all provinces in one response, ordered by province then year (for charts and bulk analysis).
| Name | Type | Required | Description |
|---|---|---|---|
province_code | string | Optional | Kemendagri province code; omit for all provinces (two digits like 31) |
curl "https://refnusa.dev/v1/wages/ump/history?province_code=31"await fetch("https://refnusa.dev/v1/wages/ump/history?province_code=31").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/wages/ump/history", params={"province_code":"31"}).json(){
"province_code": "31",
"history": [
{
"year": 1997,
"province_code": "31",
"province_name": "Daerah Khusus Ibukota Jakarta",
"amount_idr": 172500,
"source_instrument": "BPS table 220, \"Upah Minimum Regional/Propinsi (Rupiah)\", year 1997. BPS reports one amount per year; the effective date is taken as 1 January.",
"effective_date": "1997-01-01",
"source_url": "https://www.bps.go.id/id/statistics-table/2/MjIwIzI=/upah-minimum-regional-propinsi.html"
},
{
"year": 1998,
"province_code": "31",
"province_name": "Daerah Khusus Ibukota Jakarta",
"amount_idr": 198500,
"source_instrument": "BPS table 220, \"Upah Minimum Regional/Propinsi (Rupiah)\", year 1998. BPS reports one amount per year; the effective date is taken as 1 January.",
"effective_date": "1998-01-01",
"source_url": "https://www.bps.go.id/id/statistics-table/2/MjIwIzI=/upah-minimum-regional-propinsi.html"
},
{
"year": 1999,
"province_code": "31",
"province_name": "Daerah Khusus Ibukota Jakarta",
"amount_idr": 231000,
"source_instrument": "BPS table 220, \"Upah Minimum Regional/Propinsi (Rupiah)\", year 1999. BPS reports one amount per year; the effective date is taken as 1 January.",
"effective_date": "1999-01-01",
"source_url": "https://www.bps.go.id/id/statistics-table/2/MjIwIzI=/upah-minimum-regional-propinsi.html"
},
// 27 more
]
}GET /v1/wages/umk
Regency or city minimum wage (UMK) for one year. With regency_code: that kabupaten/kota (default year: its newest). Without it: every kabupaten/kota with a confirmed figure for the year (default: the newest loaded), in one response, optionally limited to one province_code.
| Name | Type | Required | Description |
|---|---|---|---|
year | integer | Optional | Calendar year, for example 2026; omit for the newest year loaded |
regency_code | string | Optional | Kemendagri kabupaten/kota code; omit to list all (like 32.73) |
province_code | string | Optional | Kemendagri province code; used only when regency_code is omitted (two digits like 32) |
curl "https://refnusa.dev/v1/wages/umk?year=2026®ency_code=32.73"await fetch("https://refnusa.dev/v1/wages/umk?year=2026®ency_code=32.73").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/wages/umk", params={"year":2026,"regency_code":"32.73"}).json(){
"year": 2026,
"umk": [
{
"regency_code": "32.73",
"regency_name": "Kota Bandung",
"province_code": "32",
"amount_idr": 4737678,
"source_instrument": "Keputusan Gubernur Jawa Barat Nomor 561.7/Kep.862-Kesra/2025 tentang Upah Minimum Kabupaten/Kota Tahun 2026",
"effective_date": "2026-01-01",
"source_url": "https://jdih.jabarprov.go.id/page/eksekusi_download/32/2025kg00320862.pdf"
}
]
}GET /v1/wages/umk/history
Every loaded year of the regency or city minimum wage (UMK) for one kabupaten/kota, oldest first, each row with its source instrument and URL: a governor decree, or for some regions the open-data portal of the regional government (source_instrument then starts with Portal and notes that the dataset has no decree number). Covers Jawa Barat 2023 to 2026, Jawa Tengah 2022 to 2026, Jawa Timur 2024 to 2026, a few Riau and Bali regions for 2024, Kalimantan Barat (2019, 2022, 2025), Banten (2020 to 2024), seven Sumatera Selatan regions (2024), five Kalimantan Timur regions (Berau, Kutai Barat, Kutai Timur, Penajam Paser Utara, Samarinda), six Magelang-area regions 2014 to 2020, Kota Tegal 2021 and Rembang (2010, 2019). Where no decree or portal row exists, BPS provincial tables fill in (source_instrument then starts with BPS table, one amount per year, no decree number or effective date): Sumatera Utara 2015 to 2024, Kepulauan Riau 2016 to 2025, Jawa Tengah 2017 to 2021, Banten 2014 to 2019, Nusa Tenggara Timur 2016 to 2025 (not 2019), Lampung 2017 to 2025, DI Yogyakarta 2016 to 2025, plus UMK 2026 for Nusa Tenggara Timur and 12 Lampung regions.
| Name | Type | Required | Description |
|---|---|---|---|
regency_code | string | Required | Kemendagri kabupaten/kota code (like 32.73) |
curl "https://refnusa.dev/v1/wages/umk/history?regency_code=32.73"await fetch("https://refnusa.dev/v1/wages/umk/history?regency_code=32.73").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/wages/umk/history", params={"regency_code":"32.73"}).json(){
"regency_code": "32.73",
"history": [
{
"year": 2023,
"regency_code": "32.73",
"regency_name": "Kota Bandung",
"province_code": "32",
"amount_idr": 4048462.69,
"source_instrument": "Keputusan Gubernur Jawa Barat Nomor 561.7/Kep.776-Kesra/2022, Upah Minimum Kabupaten/Kota Tahun 2023",
"effective_date": "2023-01-01",
"source_url": "https://jdih.jabarprov.go.id/page/eksekusi_download/32/2022kg00320776.pdf"
},
{
"year": 2024,
"regency_code": "32.73",
"regency_name": "Kota Bandung",
"province_code": "32",
"amount_idr": 4209309,
"source_instrument": "Keputusan Gubernur Jawa Barat Nomor 561.7/Kep.804-Kesra/2023, Upah Minimum Kabupaten/Kota Tahun 2024",
"effective_date": "2024-01-01",
"source_url": "https://jdih.jabarprov.go.id/page/eksekusi_download/32/2023kg00320804.pdf"
},
{
"year": 2025,
"regency_code": "32.73",
"regency_name": "Kota Bandung",
"province_code": "32",
"amount_idr": 4482914.09,
"source_instrument": "Keputusan Gubernur Jawa Barat Nomor 561.7/Kep.798-Kesra/2024, Upah Minimum Kabupaten/Kota Tahun 2025",
"effective_date": "2025-01-01",
"source_url": "https://jdih.jabarprov.go.id/page/eksekusi_download/32/2024kg00320798.pdf"
},
// 1 more
]
}GET /v1/wilayah
Administrative regions: the 38 provinces, the children of one parent code, or one region by code.
| Name | Type | Required | Description |
|---|---|---|---|
level | string | Optional | Level to list; anything below provinsi needs parent_code |
parent_code | string | Optional | List the children of this code (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001) |
code | string | Optional | Return this one region (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001) |
curl "https://refnusa.dev/v1/wilayah?parent_code=31"await fetch("https://refnusa.dev/v1/wilayah?parent_code=31").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/wilayah", params={"parent_code":"31"}).json(){
"items": [
{
"code": "31.01",
"name": "Kabupaten Administrasi Kepulauan Seribu",
"level": "kabupaten",
"parent_code": "31",
"latitude": -5.746481,
"longitude": 106.61316,
"elevation_m": 8,
"utc_offset": 7
},
{
"code": "31.71",
"name": "Kota Administrasi Jakarta Pusat",
"level": "kabupaten",
"parent_code": "31",
"latitude": -6.172913,
"longitude": 106.818696,
"elevation_m": 5,
"utc_offset": 7
},
{
"code": "31.72",
"name": "Kota Administrasi Jakarta Utara ",
"level": "kabupaten",
"parent_code": "31",
"latitude": -6.120028,
"longitude": 106.892495,
"elevation_m": 6,
"utc_offset": 7
},
// 3 more
],
"source_instrument": "Kepmendagri No 300.2.2-2138 Tahun 2025 as stated in the header of cahyadsn/wilayah db/wilayah.sql (the repository README cites No 300.2.2-2430 Tahun 2025), commit 55a496d, MIT",
"effective_date": "2026-02-13"
}GET /v1/wilayah/:code
One administrative region by code.
| Name | Type | Required | Description |
|---|---|---|---|
code | string | Required | Kemendagri wilayah code (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001) |
curl "https://refnusa.dev/v1/wilayah/31.71.01.1002"await fetch("https://refnusa.dev/v1/wilayah/31.71.01.1002").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/wilayah/31.71.01.1002").json(){
"code": "31.71.01.1002",
"name": "Cideng",
"level": "kelurahan",
"parent_code": "31.71.01",
"source_instrument": "Kepmendagri No 300.2.2-2138 Tahun 2025 as stated in the header of cahyadsn/wilayah db/wilayah.sql (the repository README cites No 300.2.2-2430 Tahun 2025), commit 55a496d, MIT",
"effective_date": "2026-02-13"
}GET /v1/postal-codes/reverse
Regions that carry one postal code.
| Name | Type | Required | Description |
|---|---|---|---|
code | string | Required | Postal code (five digits) |
curl "https://refnusa.dev/v1/postal-codes/reverse?code=10150"await fetch("https://refnusa.dev/v1/postal-codes/reverse?code=10150").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/postal-codes/reverse", params={"code":"10150"}).json(){
"postal_code": "10150",
"wilayah": [
{
"code": "31.71.01.1002",
"name": "Cideng",
"level": "kelurahan"
}
],
"source_instrument": "cahyadsn/wilayah_kodepos json/wilayah_kodepos.json, commit ba84971, MIT",
"effective_date": "2026-07-17"
}GET /v1/postal-codes/:wilayah_code
Postal codes of one kelurahan or desa by its wilayah code.
| Name | Type | Required | Description |
|---|---|---|---|
wilayah_code | string | Required | Kemendagri wilayah code (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001) |
curl "https://refnusa.dev/v1/postal-codes/31.71.01.1001"await fetch("https://refnusa.dev/v1/postal-codes/31.71.01.1001").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/postal-codes/31.71.01.1001").json(){
"wilayah_code": "31.71.01.1001",
"postal_codes": [
"10110"
],
"source_instrument": "cahyadsn/wilayah_kodepos json/wilayah_kodepos.json, commit ba84971, MIT",
"effective_date": "2026-07-17"
}GET /v1/tax/pph21-ter
PPh 21 effective average rate (TER) bracket for a monthly gross income and TER category A, B or C, per PP 58/2023.
| Name | Type | Required | Description |
|---|---|---|---|
category | string | Required | TER category A, B or C |
income_idr | integer | Required | Monthly gross income in rupiah |
curl "https://refnusa.dev/v1/tax/pph21-ter?category=A&income_idr=10000000"await fetch("https://refnusa.dev/v1/tax/pph21-ter?category=A&income_idr=10000000").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/tax/pph21-ter", params={"category":"A","income_idr":10000000}).json(){
"category": "A",
"income_idr": 10000000,
"rate_percent": 2,
"bracket": {
"lower_idr": 9650001,
"upper_idr": 10050000
},
"source_instrument": "Peraturan Pemerintah Nomor 58 Tahun 2023 tentang Tarif Pemotongan Pajak Penghasilan Pasal 21 atas Penghasilan Sehubungan dengan Pekerjaan, Jasa, atau Kegiatan Wajib Pajak Orang Pribadi, Lampiran huruf A, B, dan C (Tarif Efektif Bulanan)",
"effective_date": "2024-01-01",
"source_url": "https://peraturan.bpk.go.id/Download/332609/PP%20Nomor%2058%20Tahun%202023.pdf"
}GET /v1/tax/pph21-ter/brackets
Every PPh 21 TER bracket (lower and upper monthly income, rate) of category A, B or C, or all three when no category is given.
| Name | Type | Required | Description |
|---|---|---|---|
category | string | Optional | TER category A, B or C; omit for all |
curl "https://refnusa.dev/v1/tax/pph21-ter/brackets?category=A"await fetch("https://refnusa.dev/v1/tax/pph21-ter/brackets?category=A").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/tax/pph21-ter/brackets", params={"category":"A"}).json(){
"brackets": [
{
"category": "A",
"lower_idr": 0,
"upper_idr": 5400000,
"rate_percent": 0
},
{
"category": "A",
"lower_idr": 5400001,
"upper_idr": 5650000,
"rate_percent": 0.25
},
{
"category": "A",
"lower_idr": 5650001,
"upper_idr": 5950000,
"rate_percent": 0.5
},
// 41 more
],
"source_instrument": "Peraturan Pemerintah Nomor 58 Tahun 2023 tentang Tarif Pemotongan Pajak Penghasilan Pasal 21 atas Penghasilan Sehubungan dengan Pekerjaan, Jasa, atau Kegiatan Wajib Pajak Orang Pribadi, Lampiran huruf A, B, dan C (Tarif Efektif Bulanan)",
"effective_date": "2024-01-01",
"source_url": "https://peraturan.bpk.go.id/Download/332609/PP%20Nomor%2058%20Tahun%202023.pdf"
}GET /v1/tax/ptkp
Annual non-taxable income (PTKP) for a taxpayer status such as TK/0 or K/1.
| Name | Type | Required | Description |
|---|---|---|---|
status | string | Required | PTKP status code (TK/0 to TK/3, K/0 to K/3, K/I/0 to K/I/3) |
curl "https://refnusa.dev/v1/tax/ptkp?status=K%2F1"await fetch("https://refnusa.dev/v1/tax/ptkp?status=K%2F1").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/tax/ptkp", params={"status":"K/1"}).json(){
"status": "K/1",
"amount_idr": 63000000,
"period": "annual",
"source_instrument": "Peraturan Menteri Keuangan Nomor 101/PMK.010/2016 tentang Penyesuaian Besarnya Penghasilan Tidak Kena Pajak",
"effective_date": "2016-01-01",
"source_url": "https://peraturan.bpk.go.id/Download/111866/PMK%20Nomor%20101%20Tahun%202016.pdf"
}GET /v1/prayer-times
Prayer times for one kabupaten/kota and date, computed by a documented hisab method; not an official Kemenag feed.
| Name | Type | Required | Description |
|---|---|---|---|
city_code | string | Required | Kemendagri kabupaten/kota code; a kecamatan or kelurahan code falls back to its parent (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001) |
date | date | Required | Date in YYYY-MM-DD form |
curl "https://refnusa.dev/v1/prayer-times?city_code=31.71&date=2026-10-01"await fetch("https://refnusa.dev/v1/prayer-times?city_code=31.71&date=2026-10-01").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/prayer-times", params={"city_code":"31.71","date":"2026-10-01"}).json(){
"city_code": "31.71",
"city_name": "Kota Administrasi Jakarta Pusat",
"date": "2026-10-01",
"timezone": "WIB",
"utc_offset": 7,
"fajr": "04:23",
"sunrise": "05:35",
"dzuhur": "11:45",
"ashr": "14:51",
"maghrib": "17:50",
"isha": "18:59",
"method": "computed, not an official Kemenag feed",
"parameters": {
"fajr_angle": 20,
"isha_angle": 18,
"asr_factor": 1,
"ihtiyat_minutes": 2,
"dhuhr_offset_minutes": 0
},
"source_instrument": "Subuh at 20 degrees as stated by the Dirjen Bimas Islam, Kementerian Agama (kemenag.go.id, 2020-12-21). Isya at 18 degrees, Ashar at shadow ratio 1 and ihtiyat 2 minutes are labelled estimates commonly published for Indonesia. Checked against the Bimas Islam jadwal shalat for Kota Jakarta: within 1 minute on six dates in February and March 2026.",
"effective_date": "2026-09-23"
}GET /v1/bpjs-rates
BPJS contribution rates as a percent of monthly wage, per program (JHT, JP, JKK, JKM, JKP, JKN), with the decree behind each rate. JKK serves the PP 6/2025 bands; the 2026 JP wage cap is Rp10.547.400 (the BPJS article 18913 says Rp10.547.000, see the row note).
| Name | Type | Required | Description |
|---|---|---|---|
program | string | Optional | Program; omit for all |
status | string | Optional | current (default) or superseded rows, or all |
curl "https://refnusa.dev/v1/bpjs-rates?program=JKK"await fetch("https://refnusa.dev/v1/bpjs-rates?program=JKK").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/bpjs-rates", params={"program":"JKK"}).json(){
"rates": [
{
"program": "JKK",
"component": "iuran",
"payer": "employer",
"risk_level": "sangat_rendah",
"rate_percent": 0.1,
"wage_cap_idr": null,
"status": "current",
"source_instrument": "Peraturan Pemerintah Nomor 6 Tahun 2025 tentang Perubahan atas Peraturan Pemerintah Nomor 37 Tahun 2021 tentang Penyelenggaraan Program Jaminan Kehilangan Pekerjaan, Pasal I angka 2 (Pasal 11 ayat (5))",
"effective_date": "2025-02-07",
"source_url": "https://peraturan.bpk.go.id/Download/375603/PP%20Nomor%206%20Tahun%202025.pdf",
"note": "Band rate after the 0,14% recomposition for JKP; paid by the employer (PP 44/2015 Pasal 16 ayat (3))."
},
{
"program": "JKK",
"component": "iuran",
"payer": "employer",
"risk_level": "rendah",
"rate_percent": 0.4,
"wage_cap_idr": null,
"status": "current",
"source_instrument": "Peraturan Pemerintah Nomor 6 Tahun 2025 tentang Perubahan atas Peraturan Pemerintah Nomor 37 Tahun 2021 tentang Penyelenggaraan Program Jaminan Kehilangan Pekerjaan, Pasal I angka 2 (Pasal 11 ayat (5))",
"effective_date": "2025-02-07",
"source_url": "https://peraturan.bpk.go.id/Download/375603/PP%20Nomor%206%20Tahun%202025.pdf",
"note": "Band rate after the 0,14% recomposition for JKP; paid by the employer (PP 44/2015 Pasal 16 ayat (3))."
},
{
"program": "JKK",
"component": "iuran",
"payer": "employer",
"risk_level": "sedang",
"rate_percent": 0.75,
"wage_cap_idr": null,
"status": "current",
"source_instrument": "Peraturan Pemerintah Nomor 6 Tahun 2025 tentang Perubahan atas Peraturan Pemerintah Nomor 37 Tahun 2021 tentang Penyelenggaraan Program Jaminan Kehilangan Pekerjaan, Pasal I angka 2 (Pasal 11 ayat (5))",
"effective_date": "2025-02-07",
"source_url": "https://peraturan.bpk.go.id/Download/375603/PP%20Nomor%206%20Tahun%202025.pdf",
"note": "Band rate after the 0,14% recomposition for JKP; paid by the employer (PP 44/2015 Pasal 16 ayat (3))."
},
// 2 more
]
}GET /v1/bank-codes
Three-digit bank codes (Sandi Bank) of the commercial and sharia banks on the OJK head-office list of June 2026, by code or by part of the bank name; no argument lists all 105.
| Name | Type | Required | Description |
|---|---|---|---|
code | string | Optional | Sandi Bank, optional (three digits like 014) |
name | string | Optional | Part of the bank name, optional |
curl "https://refnusa.dev/v1/bank-codes?code=014"await fetch("https://refnusa.dev/v1/bank-codes?code=014").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/bank-codes", params={"code":"014"}).json(){
"banks": [
{
"bank_code": "014",
"bank_name": "PT BANK CENTRAL ASIA Tbk",
"category": "BANK UMUM SWASTA NASIONAL",
"note": null,
"source_instrument": "OJK, List of Commercial Banks and Sharia Banks Head Offices - June 2026 (sheet \"Daftar Bank Umum\", column Sandi Bank)",
"effective_date": "2026-06",
"source_url": "https://www.ojk.go.id/en/kanal/perbankan/data-dan-statistik/Documents/Pages/Daftar-Alamat-Kantor-Pusat-Bank-Umum-Dan-Syariah/List%20of%20Commercial%20Banks%20and%20Sharia%20Banks%20Head%20Offices%20-%20June%202026.xlsx"
}
]
}GET /v1/fuel-prices
Retail price per litre of the subsidised and special-assignment fuels (Solar, minyak tanah, RON 90) from Kepmen ESDM 218.K/MG.01/MEM.M/2022. Non-subsidised fuels are not included.
| Name | Type | Required | Description |
|---|---|---|---|
fuel | string | Optional | kerosene, gas_oil (Solar) or ron90; omit for all three |
curl "https://refnusa.dev/v1/fuel-prices?fuel=gas_oil"await fetch("https://refnusa.dev/v1/fuel-prices?fuel=gas_oil").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/fuel-prices", params={"fuel":"gas_oil"}).json(){
"fuel_prices": [
{
"fuel_code": "gas_oil",
"fuel_name": "Minyak solar (gas oil)",
"category": "bbm_tertentu",
"price_idr_per_litre": 6800,
"taxes_included": "PPN and PBBKB",
"note": "Diktum KESATU angka 2; price at the delivery point (titik serah), per litre.",
"source_instrument": "Keputusan Menteri ESDM Nomor 218.K/MG.01/MEM.M/2022 tentang Harga Jual Eceran Jenis Bahan Bakar Minyak Tertentu dan Jenis Bahan Bakar Minyak Khusus Penugasan",
"effective_date": "2022-09-03",
"source_url": "https://migas.esdm.go.id/post/kepmen-esdm-tentang-harga-jual-eceran-bbm-jenis-tertentu-dan-khusus-penugasan"
}
]
}GET /v1/food-prices/commodities
The 10 staple food groups and their 21 items that PIHPS Nasional (Bank Indonesia) reports per province, with code, Indonesian and English name, unit (Rp/kg), the markets (tradisional, modern) that have a price on the newest day, and for the groups the first and last month of the monthly series.
No parameters.
curl "https://refnusa.dev/v1/food-prices/commodities"await fetch("https://refnusa.dev/v1/food-prices/commodities").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/food-prices/commodities").json(){
"source": "PIHPS Nasional, Bank Indonesia",
"source_instrument": "PIHPS Nasional (Pusat Informasi Harga Pangan Strategis), Bank Indonesia: daily grid, 10 commodity groups and 21 items; traditional markets (Pasar Tradisional) and modern markets (Pasar Modern)",
"source_url": "https://www.bi.go.id/hargapangan",
"unit": "Rp/kg",
"price_type": "province value for traditional markets (Pasar Tradisional) on the observation day, not a monthly average; the markets list says where modern markets are also reported",
"markets": [
"tradisional",
"modern"
],
"latest_observed_on": {
"modern": "2026-11-06",
"tradisional": "2026-11-06"
},
"commodities": [
{
"code": "beras",
"pihps_code": 1,
"pihps_id": "1",
"name_id": "Beras",
"name_en": "Rice",
"unit": "Rp/kg",
"first_month": "2017-05",
"last_month": "2026-11",
"markets": [
"tradisional",
"modern"
],
"items": [
{
"code": "beras_bawah_1",
"pihps_id": "1_1",
"name_id": "Beras Kualitas Bawah I",
"name_en": "Rice, lower quality I",
"unit": "Rp/kg",
"markets": [
"tradisional",
"modern"
]
},
{
"code": "beras_bawah_2",
"pihps_id": "1_2",
"name_id": "Beras Kualitas Bawah II",
"name_en": "Rice, lower quality II",
"unit": "Rp/kg",
"markets": [
"tradisional",
"modern"
]
},
{
"code": "beras_medium_1",
"pihps_id": "1_3",
"name_id": "Beras Kualitas Medium I",
"name_en": "Rice, medium quality I",
"unit": "Rp/kg",
"markets": [
"tradisional",
"modern"
]
},
// 3 more
]
},
{
"code": "daging_ayam",
"pihps_code": 2,
"pihps_id": "2",
"name_id": "Daging Ayam",
"name_en": "Chicken meat",
"unit": "Rp/kg",
"first_month": "2017-05",
"last_month": "2026-11",
"markets": [
"tradisional",
"modern"
],
"items": [
{
"code": "daging_ayam_ras",
"pihps_id": "2_7",
"name_id": "Daging Ayam Ras Segar",
"name_en": "Fresh broiler chicken",
"unit": "Rp/kg",
"markets": [
"tradisional",
"modern"
]
}
]
},
{
"code": "daging_sapi",
"pihps_code": 3,
"pihps_id": "3",
"name_id": "Daging Sapi",
"name_en": "Beef",
"unit": "Rp/kg",
"first_month": "2017-05",
"last_month": "2026-11",
"markets": [
"tradisional",
"modern"
],
"items": [
{
"code": "daging_sapi_1",
"pihps_id": "3_8",
"name_id": "Daging Sapi Kualitas 1",
"name_en": "Beef, quality 1",
"unit": "Rp/kg",
"markets": [
"tradisional",
"modern"
]
},
{
"code": "daging_sapi_2",
"pihps_id": "3_9",
"name_id": "Daging Sapi Kualitas 2",
"name_en": "Beef, quality 2",
"unit": "Rp/kg",
"markets": [
"tradisional",
"modern"
]
}
]
},
// 7 more
]
}GET /v1/food-prices/latest
Latest PIHPS Nasional (Bank Indonesia) price of a staple food per province, in Rp/kg, on the newest observation day, plus PIHPS national averages. Covers the 10 groups and 21 items. Without market you get one row per province and commodity: the traditional-market (tradisional) price when it exists, otherwise the modern-market price; each row names its market and day. Traditional markets report for fewer provinces than modern ones. Pass market for one market only. Filter by commodity, province and market. With month (YYYY-MM): the monthly series price instead, for the 10 groups in traditional markets only.
| Name | Type | Required | Description |
|---|---|---|---|
commodity | string | Optional | Commodity code from list_food_commodities (a group or an item), optional; with month, groups only |
market | string | Optional | tradisional or modern; omit for one row per province and commodity, tradisional first then modern (with month: tradisional only) |
province_code | string | Optional | Kemendagri province code, optional (Papua and Papua Barat only: 91, 92) (two digits like 31) |
month | string | Optional | Return this month instead of the newest on file, optional (YYYY-MM like 2026-03) |
curl "https://refnusa.dev/v1/food-prices/latest?commodity=beras&province_code=31"await fetch("https://refnusa.dev/v1/food-prices/latest?commodity=beras&province_code=31").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/food-prices/latest", params={"commodity":"beras","province_code":"31"}).json(){
"source": "PIHPS Nasional, Bank Indonesia",
"source_instrument": "PIHPS Nasional (Pusat Informasi Harga Pangan Strategis), Bank Indonesia: daily grid, 10 commodity groups and 21 items; traditional markets (Pasar Tradisional) and modern markets (Pasar Modern)",
"source_url": "https://www.bi.go.id/hargapangan",
"unit": "Rp/kg",
"price_type": "province value for traditional markets (Pasar Tradisional) on the observation day, not a monthly average; or province value for modern markets (Pasar Modern) on the observation day, not a monthly average. Each row names its market. Provinces differ by market: not every province reports in both",
"market": null,
"observed_on_max": "2026-11-06",
"national": [
{
"commodity": "beras",
"market": "modern",
"price_idr_per_kg": 16450,
"observed_on": "2026-11-06"
},
{
"commodity": "beras",
"market": "tradisional",
"price_idr_per_kg": 16500,
"observed_on": "2026-11-06"
}
],
"prices": [
{
"province_code": "31",
"province_name": "Daerah Khusus Ibukota Jakarta",
"commodity": "beras",
"market": "tradisional",
"period": "2026-11",
"observed_on": "2026-11-06",
"price_idr_per_kg": 16950,
"unit": "Rp/kg"
}
]
}GET /v1/food-prices/series
Monthly PIHPS Nasional (Bank Indonesia) price series, in Rp/kg, for one province and one staple food from May 2017; each point is the price on the first day of the month with data (observed_on). Optional from and to months.
| Name | Type | Required | Description |
|---|---|---|---|
commodity | string | Required | Commodity code from list_food_commodities |
province_code | string | Required | Kemendagri province code (two digits like 31) |
from | string | Optional | First month, optional (YYYY-MM like 2026-03) |
to | string | Optional | Last month, optional (YYYY-MM like 2026-03) |
curl "https://refnusa.dev/v1/food-prices/series?commodity=beras&province_code=31&from=2026-01"await fetch("https://refnusa.dev/v1/food-prices/series?commodity=beras&province_code=31&from=2026-01").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/food-prices/series", params={"commodity":"beras","province_code":"31","from":"2026-01"}).json(){
"source": "PIHPS Nasional, Bank Indonesia",
"source_instrument": "PIHPS Nasional (Pusat Informasi Harga Pangan Strategis), Bank Indonesia: daily grid, 10 commodity groups and 21 items; traditional markets (Pasar Tradisional) and modern markets (Pasar Modern)",
"source_url": "https://www.bi.go.id/hargapangan",
"unit": "Rp/kg",
"price_type": "province value for traditional markets (Pasar Tradisional) on the observation day, not a monthly average",
"province_code": "31",
"commodity": "beras",
"count": 11,
"series": [
{
"period": "2026-01",
"observed_on": "2026-01-01",
"price_idr_per_kg": 16300
},
{
"period": "2026-02",
"observed_on": "2026-01-30",
"price_idr_per_kg": 16500
},
{
"period": "2026-03",
"observed_on": "2026-02-27",
"price_idr_per_kg": 16600
},
// 8 more
]
}GET /v1/passport-fees
Imigrasi PNBP fees from PP 45/2024: passport (biasa 5 and 10 years, electronic and non-electronic, SPLP, same-day service) and visa kunjungan (single and multiple trip). Government fee only.
| Name | Type | Required | Description |
|---|---|---|---|
category | string | Optional | passport or visa; omit for all |
fee_code | string | Optional | One fee by code, optional (lowercase code like passport_biasa_elektronik_10y) |
curl "https://refnusa.dev/v1/passport-fees?category=passport"await fetch("https://refnusa.dev/v1/passport-fees?category=passport").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/passport-fees", params={"category":"passport"}).json(){
"fees": [
{
"fee_code": "passport_biasa_nonelektronik_5y",
"category": "passport",
"item": "Paspor Biasa Nonelektronik, masa berlaku paling lama 5 tahun",
"unit": "per permohonan",
"amount_idr": 350000,
"location": "Lampiran III huruf A (Dokumen Perjalanan Republik Indonesia) angka 1",
"source_instrument": "Peraturan Pemerintah Nomor 45 Tahun 2024 tentang Jenis dan Tarif atas Jenis Penerimaan Negara Bukan Pajak yang Berlaku pada Kementerian Hukum dan Hak Asasi Manusia, Lampiran III (Pelayanan Keimigrasian)",
"effective_date": "2024-12-17",
"source_url": "https://peraturan.bpk.go.id/Download/365416/PP%20Nomor%2045%20Tahun%202024.pdf"
},
{
"fee_code": "passport_biasa_nonelektronik_10y",
"category": "passport",
"item": "Paspor Biasa Nonelektronik, masa berlaku paling lama 10 tahun",
"unit": "per permohonan",
"amount_idr": 650000,
"location": "Lampiran III huruf A (Dokumen Perjalanan Republik Indonesia) angka 2",
"source_instrument": "Peraturan Pemerintah Nomor 45 Tahun 2024 tentang Jenis dan Tarif atas Jenis Penerimaan Negara Bukan Pajak yang Berlaku pada Kementerian Hukum dan Hak Asasi Manusia, Lampiran III (Pelayanan Keimigrasian)",
"effective_date": "2024-12-17",
"source_url": "https://peraturan.bpk.go.id/Download/365416/PP%20Nomor%2045%20Tahun%202024.pdf"
},
{
"fee_code": "passport_biasa_elektronik_5y",
"category": "passport",
"item": "Paspor Biasa Elektronik, masa berlaku paling lama 5 tahun",
"unit": "per permohonan",
"amount_idr": 650000,
"location": "Lampiran III huruf A (Dokumen Perjalanan Republik Indonesia) angka 3",
"source_instrument": "Peraturan Pemerintah Nomor 45 Tahun 2024 tentang Jenis dan Tarif atas Jenis Penerimaan Negara Bukan Pajak yang Berlaku pada Kementerian Hukum dan Hak Asasi Manusia, Lampiran III (Pelayanan Keimigrasian)",
"effective_date": "2024-12-17",
"source_url": "https://peraturan.bpk.go.id/Download/365416/PP%20Nomor%2045%20Tahun%202024.pdf"
},
// 4 more
]
}GET /v1/kbli
Search the KBLI 2020 business-field classification (Peraturan BPS 2/2020) by part of the title or a code prefix, optionally one of its five levels (kategori, golongan_pokok, golongan, subgolongan, kelompok). Returns code, level, parent and title; fetch one code for its description.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Optional | Part of the title, or the start of a code, optional |
level | string | Optional | Restrict to one level, optional |
limit | integer | Optional | Maximum items returned, default 50 |
curl "https://refnusa.dev/v1/kbli?q=akuntansi&level=subgolongan"await fetch("https://refnusa.dev/v1/kbli?q=akuntansi&level=subgolongan").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/kbli", params={"q":"akuntansi","level":"subgolongan"}).json(){
"total": 4,
"returned": 4,
"items": [
{
"code": "6920",
"level": "subgolongan",
"parent": "692",
"title": "AKTIVITAS AKUNTANSI, PEMBUKUAN DAN PEMERIKSA; KONSULTASI PAJAK",
"source_instrument": "Peraturan Badan Pusat Statistik Nomor 2 Tahun 2020 tentang Klasifikasi Baku Lapangan Usaha Indonesia (KBLI 2020), diundangkan 24 September 2020",
"effective_date": "2020-09-24",
"source_url": "https://ppid.bps.go.id/upload/doc/KBLI_2020_1659511143.pdf"
},
{
"code": "1709",
"level": "subgolongan",
"parent": "170",
"title": "INDUSTRI BARANG DARI KERTAS DAN PAPAN KERTAS LAINNYA",
"source_instrument": "Peraturan Badan Pusat Statistik Nomor 2 Tahun 2020 tentang Klasifikasi Baku Lapangan Usaha Indonesia (KBLI 2020), diundangkan 24 September 2020",
"effective_date": "2020-09-24",
"source_url": "https://ppid.bps.go.id/upload/doc/KBLI_2020_1659511143.pdf"
},
{
"code": "7020",
"level": "subgolongan",
"parent": "702",
"title": "AKTIVITAS KONSULTASI MANAJEMEN",
"source_instrument": "Peraturan Badan Pusat Statistik Nomor 2 Tahun 2020 tentang Klasifikasi Baku Lapangan Usaha Indonesia (KBLI 2020), diundangkan 24 September 2020",
"effective_date": "2020-09-24",
"source_url": "https://ppid.bps.go.id/upload/doc/KBLI_2020_1659511143.pdf"
},
// 1 more
]
}GET /v1/kbli/:code
One KBLI 2020 entry by code (a letter A to U, or 2, 3, 4 or 5 digits) with its description, its ancestors up to the kategori and its children.
| Name | Type | Required | Description |
|---|---|---|---|
code | string | Required | KBLI code (a letter A-U or 2 to 5 digits like 62019) |
curl "https://refnusa.dev/v1/kbli/62019"await fetch("https://refnusa.dev/v1/kbli/62019").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/kbli/62019").json(){
"item": {
"code": "62019",
"level": "kelompok",
"parent": "6201",
"title": "AKTIVITAS PEMROGRAMAN KOMPUTER LAINNYA",
"description": "Kelompok ini mencakup konsultasi yang berkaitan dengan analisis, desain dan pemrograman dari sistem yang siap pakai lainnya (selain yang sudah dicakup di kelompok 62011 dan 62015). Kegiatan ini biasanya menyangkut analisis kebutuhan pengguna komputer dan permasalahannya, pemecahan permasalahan, dan membuat perangkat lunak berkaitan dengan pemecahan masalah tersebut. Termasuk pula penulisan program sederhana sesuai kebutuhan pengguna komputer. Perancangan struktur dan isi dari, dan/atau penulisan kode komputer yang diperlukan untuk membuat dan mengimplementasikan, seperti piranti lunak sistem (pemutakhiran dan perbaikan), piranti lunak aplikasi (pemutakhiran dan perbaikan), basis data dan laman web. Termasuk penyesuaian perangkat lunak, misalnya modifikasi dan penyesuaian konfigurasi aplikasi yang sudah ada sehingga berfungsi dalam lingkungan sistem informasi klien. Kegiatan penyesuaian perangkat lunak sejenis yang dilaksanakan sebagai bagian yang tak terpisahkan dari penjualan perangkat lunak dimasukkan dalam subgolongan 47413.",
"source_instrument": "Peraturan Badan Pusat Statistik Nomor 2 Tahun 2020 tentang Klasifikasi Baku Lapangan Usaha Indonesia (KBLI 2020), diundangkan 24 September 2020",
"effective_date": "2020-09-24",
"source_url": "https://ppid.bps.go.id/upload/doc/KBLI_2020_1659511143.pdf"
},
"ancestors": [
{
"code": "J",
"level": "kategori",
"parent": "",
"title": "INFORMASI DAN KOMUNIKASI"
},
{
"code": "62",
"level": "golongan_pokok",
"parent": "J",
"title": "AKTIVITAS PEMROGRAMAN, KONSULTASI KOMPUTER DAN KEGIATAN YBDI"
},
{
"code": "620",
"level": "golongan",
"parent": "62",
"title": "AKTIVITAS PEMROGRAMAN, KONSULTASI KOMPUTER DAN KEGIATAN YBDI"
},
// 1 more
],
"children": []
}GET /v1/tax-rates
Tax and duty rates, each with its decree: PPN 12% and the 11/12 DPP (PMK 131/2024), Bea Meterai tariff and threshold (UU 10/2020), and the domestic cukai hasil tembakau table (PMK 97/2024 Lampiran I).
| Name | Type | Required | Description |
|---|---|---|---|
category | string | Optional | ppn, bea_meterai or cukai_hasil_tembakau; omit for all |
rate_code | string | Optional | One rate by code, optional (lowercase code like ppn_rate) |
curl "https://refnusa.dev/v1/tax-rates?category=ppn"await fetch("https://refnusa.dev/v1/tax-rates?category=ppn").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/tax-rates", params={"category":"ppn"}).json(){
"rates": [
{
"rate_code": "ppn_rate",
"category": "ppn",
"item": "Tarif PPN",
"unit": "percent",
"value": 12,
"conditions": "Dari harga jual atau nilai impor",
"location": "Pasal 2 ayat (2)",
"note": "PMK 131/2024 ditetapkan 31 Desember 2024, berlaku 1 Januari 2025. Pasal 2 ayat (2): \"dihitung dengan cara mengalikan tarif 12% (dua belas persen) dengan Dasar Pengenaan Pajak berupa harga jual atau nilai impor.\" (barang mewah, ayat (3)). Pasal 5: barang mewah ke konsumen akhir pada 1-31 Januari 2025 memakai 11/12 dari harga jual.",
"source_instrument": "Peraturan Menteri Keuangan Nomor 131 Tahun 2024 tentang Pajak Pertambahan Nilai",
"effective_date": "2025-01-01",
"source_url": "https://jdih.kemenkeu.go.id/api/download/ad276b82-94bd-4197-b409-af33e2842cd6/2024pmkeuangan131.pdf"
},
{
"rate_code": "ppn_non_mewah_effective",
"category": "ppn",
"item": "PPN efektif untuk BKP selain barang mewah dan JKP (DPP nilai lain 11/12)",
"unit": "percent",
"value": 11,
"conditions": "DPP berupa nilai lain 11/12 dari nilai impor, harga jual, atau penggantian; 12% x 11/12 = 11%",
"location": "Pasal 3 ayat (2) dan (3)",
"note": "Pasal 3 ayat (2): \"dihitung dengan cara mengalikan tarif 12% (dua belas persen) dengan Dasar Pengenaan Pajak berupa nilai lain.\" Ayat (3): \"Nilai lain ... dihitung sebesar 11/12 (sebelas per dua belas) dari nilai impor, harga jual, atau penggantian.\" Efektif 12% x 11/12 = 11% (dihitung dari kedua ayat). Barang mewah: 12% dari harga jual atau nilai impor, tanpa faktor 11/12. PMK 11/2025 (berlaku 4 Feb 2025) tidak dilayani.",
"source_instrument": "Peraturan Menteri Keuangan Nomor 131 Tahun 2024 tentang Pajak Pertambahan Nilai",
"effective_date": "2025-01-01",
"source_url": "https://jdih.kemenkeu.go.id/api/download/ad276b82-94bd-4197-b409-af33e2842cd6/2024pmkeuangan131.pdf"
}
]
}GET /v1/ojol-tariffs
Ride-hailing motorbike fare limits per zone (per-km lower and upper bound, minimum fare for the first 4 km) from KP 667/2022. A 2026 decision may supersede it; see the dataset note.
| Name | Type | Required | Description |
|---|---|---|---|
zone_code | string | Optional | zona_1, zona_2 or zona_3; omit for all |
curl "https://refnusa.dev/v1/ojol-tariffs?zone_code=zona_2"await fetch("https://refnusa.dev/v1/ojol-tariffs?zone_code=zona_2").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/ojol-tariffs", params={"zone_code":"zona_2"}).json(){
"zones": [
{
"zone_code": "zona_2",
"zone": "II",
"regions": "Jakarta, Bogor, Depok, Tangerang, dan Bekasi",
"per_km_lower_idr": 2550,
"per_km_upper_idr": 2800,
"min_fare_lower_idr": 10200,
"min_fare_upper_idr": 11200,
"min_fare_covers_km": 4,
"location": "Lampiran II angka 2; zona di Diktum KELIMA",
"note": null,
"source_instrument": "Keputusan Menteri Perhubungan Nomor KP 667 Tahun 2022 tentang Pedoman Perhitungan Biaya Jasa Penggunaan Sepeda Motor yang Digunakan untuk Kepentingan Masyarakat yang Dilakukan dengan Aplikasi, Lampiran II",
"effective_date": "2022-09-07",
"source_url": "https://jdih.kemenhub.go.id/api/media?data=Fho1967SU50KeVb6NRIJpK8Qie73hn1RX48Y95k6CcAp4p8JxYbTboQ48ZQxOhCLbC8W8rf5AHrkr4DsAcFFrTvw4uQoJe6rlGT8LTX0WiFEI9KwVh1owc3TJ95BkyO3sfI2BDS1bJu3pqd4lueqZfY74pKXlawH36Zsj73SV3tYveB83xCR3FYS4PFHPCgIwWnEs7BRh8iY4MWBnK5Mr9nlOB8S"
}
]
}GET /v1/zakat
BAZNAS RI 2026 zakat figures: fitrah (SK 14/2026) and the nisab and rate of zakat penghasilan dan jasa (SK 15/2026).
| Name | Type | Required | Description |
|---|---|---|---|
category | string | Optional | fitrah or penghasilan; omit for all |
zakat_code | string | Optional | One figure by code, optional (lowercase code like fitrah_uang) |
curl "https://refnusa.dev/v1/zakat?category=fitrah"await fetch("https://refnusa.dev/v1/zakat?category=fitrah").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/zakat", params={"category":"fitrah"}).json(){
"figures": [
{
"zakat_code": "fitrah_uang",
"category": "fitrah",
"item": "Zakat fitrah dalam uang",
"unit": "IDR per jiwa",
"value": 50000,
"conditions": null,
"note": "Read from the BAZNAS web page; the SK text itself was not located and the page shows no SK date, so effective_date is the year. Other published figures (aggregator Rp35.000, a regional BAZNAS Rp40.000) are not served.",
"source_instrument": "Surat Keputusan Ketua BAZNAS Nomor 14 Tahun 2026 tentang Nilai Zakat Fitrah dan Fidyah BAZNAS Tahun 1447 H/2026 M",
"effective_date": "2026",
"source_url": "https://baznas.go.id/zakatfitrah"
},
{
"zakat_code": "fitrah_beras_kg",
"category": "fitrah",
"item": "Zakat fitrah dalam beras atau makanan pokok",
"unit": "kg per jiwa",
"value": 2.5,
"conditions": "Ekuivalen 2,5 kg atau 3,5 liter beras atau makanan pokok",
"note": null,
"source_instrument": "Surat Keputusan Ketua BAZNAS Nomor 14 Tahun 2026 tentang Nilai Zakat Fitrah dan Fidyah BAZNAS Tahun 1447 H/2026 M",
"effective_date": "2026",
"source_url": "https://baznas.go.id/zakatfitrah"
},
{
"zakat_code": "fitrah_beras_liter",
"category": "fitrah",
"item": "Zakat fitrah dalam beras atau makanan pokok",
"unit": "liter per jiwa",
"value": 3.5,
"conditions": "Ekuivalen 2,5 kg atau 3,5 liter beras atau makanan pokok",
"note": null,
"source_instrument": "Surat Keputusan Ketua BAZNAS Nomor 14 Tahun 2026 tentang Nilai Zakat Fitrah dan Fidyah BAZNAS Tahun 1447 H/2026 M",
"effective_date": "2026",
"source_url": "https://baznas.go.id/zakatfitrah"
}
]
}GET /v1/het-prices
Harga eceran tertinggi: beras medium and premium by wilayah (Keputusan Kepala Bapanas 299/2025, 22 Aug 2025) and LPG 3 kg in Jawa Timur (Kepgub 801/2024).
| Name | Type | Required | Description |
|---|---|---|---|
commodity | string | Optional | Commodity; omit for all |
region | string | Optional | Part of the region name, for example Kalimantan, optional |
curl "https://refnusa.dev/v1/het-prices?commodity=beras_medium®ion=Kalimantan"await fetch("https://refnusa.dev/v1/het-prices?commodity=beras_medium®ion=Kalimantan").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/het-prices", params={"commodity":"beras_medium","region":"Kalimantan"}).json(){
"prices": [
{
"het_code": "beras_medium_kalimantan",
"commodity": "beras_medium",
"region": "Kalimantan",
"unit": "IDR per kg",
"amount_idr": 14000,
"location": "Lampiran (halaman 4), wilayah nomor 6",
"note": null,
"source_instrument": "Keputusan Kepala Badan Pangan Nasional Nomor 299 Tahun 2025 tentang Penetapan Harga Eceran Tertinggi Beras, ditetapkan 22 Agustus 2025, Lampiran",
"effective_date": "2025-08-22",
"source_url": "https://badanpangan.go.id/storage/app/media/2025/NOV/20250822_%20Kepbadan%20HET%20Beras%20Medium%20dan%20Premium_HET.pdf"
}
]
}GET /v1/stats/indicators
Regional statistics from BPS tables: the indicator ids with unit, level (province or kabupaten/kota), every period available, source table and caveats. Includes unemployment (TPT), poverty and poverty lines, HDI (IPM), wages, population, GRDP per capita, life expectancy and monthly inflation and CPI (inflation_mom, inflation_yoy, inflation_ytd, cpi for provinces; inflation_yoy_regency for CPI cities; periods YYYY-MM from 2024-01, base 2022=100). Start here, then call get_stat_values or get_stat_series.
No parameters.
curl "https://refnusa.dev/v1/stats/indicators"await fetch("https://refnusa.dev/v1/stats/indicators").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/stats/indicators").json(){
"indicators": [
{
"id": "calorie_intake_per_capita",
"title": "Calorie consumption per person per day",
"unit": "kilocalories per person per day",
"level": "provinsi",
"source_instrument": "Badan Pusat Statistik, tabel \"Rata-Rata Konsumsi Kalori dan Protein per Kapita per Hari Menurut Provinsi, 2007-2025\", column Kalori (kkal)",
"source_url": "https://webapi.bps.go.id/v1/api/view/model/statictable/lang/ind/domain/0000/id/951",
"source_files": "bps-2026-10-20/st951.json (BPS WebAPI statictable 951)",
"note": "Susenas consumption survey, annual, 2007 to 2025. The figure is intake as consumed, not as supplied. Provinces created in 2022 start with their first reported year.",
"first_period": "2007",
"last_period": "2025",
"periods": [
"2007",
"2008",
"2009",
// 16 more
],
"regions": 38,
"has_national_row": true
},
{
"id": "cpi",
"title": "Consumer price index (IHK), provinces, 2022=100",
"unit": "index, 2022=100",
"level": "provinsi",
"source_instrument": "Badan Pusat Statistik, WebAPI variable 2261, \"Indeks Harga Konsumen 38 Provinsi (2022=100)\"",
"source_url": "https://webapi.bps.go.id/v1/api/list/model/data/lang/ind/domain/0000/var/2261",
"source_files": "bps-api/inflasi/data-var2261-th124.json, -th125.json, -th126.json (BPS WebAPI var 2261, read 2026-10-20, last_update 2026-10-01 11:26:17)",
"note": "Base year 2022=100: from 2024 BPS computes the CPI from the 2022 consumption survey (SBH) of the 38 provinces; the base year is stated on the BPS variable and every series here begins January 2024. Monthly, period YYYY-MM. Read from the BPS WebAPI (domain 0000) on 2026-10-20; values as BPS returns them, two decimals. The monthly refresh is manual. General CPI level. The national row (00) is the BPS INDONESIA row.",
"first_period": "2024-01",
"last_period": "2026-09",
"periods": [
"2024-01",
"2024-02",
"2024-03",
// 30 more
],
"regions": 38,
"has_national_row": true
},
{
"id": "gini_ratio",
"title": "Gini ratio (urban and rural)",
"unit": "ratio, 0 to 1",
"level": "provinsi",
"source_instrument": "Badan Pusat Statistik, WebAPI variable 98 \"Gini Ratio Menurut Provinsi dan Daerah\", urban + rural",
"source_url": "https://webapi.bps.go.id/v1/api/list/model/data/lang/ind/domain/0000/var/98",
"source_files": "bps-2026-10-20/v98.json (BPS WebAPI var 98, turvar 191 Perkotaan+Perdesaan)",
"note": "Expenditure inequality from Susenas; 0 is equal, 1 is one household holding everything. Period is YYYY-03 or YYYY-09; a year with no semester figure carries the annual figure as YYYY. Same Papua territory caveats as poverty_depth_p1.",
"first_period": "2002",
"last_period": "2026-03",
"periods": [
"2002",
"2005",
"2007",
// 33 more
],
"regions": 38,
"has_national_row": true
},
// 62 more
]
}GET /v1/stats/values
One BPS indicator for one period across all regions in a single call (for a map), plus the national figure. Period is YYYY or YYYY-MM as listed by list_stat_indicators; omit it for the latest. A bare year on a semester indicator resolves to the latest period in that year.
| Name | Type | Required | Description |
|---|---|---|---|
indicator | string | Required | Indicator id (an id from list_stat_indicators, like unemployment_rate) |
period | string | Optional | Period, optional (default: latest) (YYYY or YYYY-MM) |
curl "https://refnusa.dev/v1/stats/values?indicator=unemployment_rate&period=2025-08"await fetch("https://refnusa.dev/v1/stats/values?indicator=unemployment_rate&period=2025-08").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/stats/values", params={"indicator":"unemployment_rate","period":"2025-08"}).json(){
"indicator": {
"id": "unemployment_rate",
"title": "Open unemployment rate (TPT)",
"unit": "percent",
"level": "provinsi",
"source_instrument": "Badan Pusat Statistik, tabel \"Tingkat Pengangguran Terbuka Menurut Provinsi (Persen)\"",
"source_url": "https://www.bps.go.id/id/statistics-table?subject=520",
"source_files": "bps/tpt/tpt_<year>.csv",
"note": "One figure per region and year: the August survey where BPS offers it, otherwise the annual figure (1986-2004), otherwise February (2026 has February only). Period is YYYY for annual, YYYY-08 for August, YYYY-02 for February. 1995 is not offered by the BPS table. Province splits: Papua Selatan (93), Papua Tengah (94), Papua Pegunungan (95) and Papua Barat Daya (96) have no values before they were created, and after the split the figures for Papua (91) and Papua Barat (92) cover the smaller territory, so a Papua or Papua Barat series is not like for like across 2021/2022/2023. Kalimantan Utara (65) starts with the 2013 data."
},
"period": "2025-08",
"national": 4.85,
"count": 38,
"values": [
{
"region_code": "11",
"region_name": "Aceh",
"value": 5.64
},
{
"region_code": "12",
"region_name": "Sumatera Utara",
"value": 5.32
},
{
"region_code": "13",
"region_name": "Sumatera Barat",
"value": 5.62
},
// 35 more
]
}GET /v1/stats/series
The time series of one BPS indicator for one region: a province (2 digits), a kabupaten/kota (5 characters like 32.73, hdi_regency and inflation_yoy_regency only) or 00 for Indonesia.
| Name | Type | Required | Description |
|---|---|---|---|
indicator | string | Required | Indicator id (an id from list_stat_indicators, like unemployment_rate) |
region_code | string | Required | Kemendagri region code, or 00 for Indonesia (00, a two-digit province code like 31, or a kabupaten/kota code like 32.73) |
curl "https://refnusa.dev/v1/stats/series?indicator=unemployment_rate®ion_code=31"await fetch("https://refnusa.dev/v1/stats/series?indicator=unemployment_rate®ion_code=31").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/stats/series", params={"indicator":"unemployment_rate","region_code":"31"}).json(){
"indicator": {
"id": "unemployment_rate",
"title": "Open unemployment rate (TPT)",
"unit": "percent",
"level": "provinsi",
"source_instrument": "Badan Pusat Statistik, tabel \"Tingkat Pengangguran Terbuka Menurut Provinsi (Persen)\"",
"source_url": "https://www.bps.go.id/id/statistics-table?subject=520",
"source_files": "bps/tpt/tpt_<year>.csv",
"note": "One figure per region and year: the August survey where BPS offers it, otherwise the annual figure (1986-2004), otherwise February (2026 has February only). Period is YYYY for annual, YYYY-08 for August, YYYY-02 for February. 1995 is not offered by the BPS table. Province splits: Papua Selatan (93), Papua Tengah (94), Papua Pegunungan (95) and Papua Barat Daya (96) have no values before they were created, and after the split the figures for Papua (91) and Papua Barat (92) cover the smaller territory, so a Papua or Papua Barat series is not like for like across 2021/2022/2023. Kalimantan Utara (65) starts with the 2013 data."
},
"region_code": "31",
"region_name": "Daerah Khusus Ibukota Jakarta",
"count": 40,
"series": [
{
"period": "1986",
"value": 10.35
},
{
"period": "1987",
"value": 9.66
},
{
"period": "1988",
"value": 10.01
},
// 37 more
]
}GET /v1/faostat/indonesia
FAOSTAT series for Indonesia: undernourishment, food insecurity, dietary energy and protein supply, and the supply of main staples (rice, wheat, maize, cassava, sugar, vegetable oils, soyabeans, poultry, eggs, fish). FAO methodology and population estimates, not comparable with BPS figures. Call without series for the list, then with series for the values.
| Name | Type | Required | Description |
|---|---|---|---|
series | string | Optional | Series id; omit for the list of series (a series id from the list, like undernourishment_pct or rice_supply_kg_cap_yr) |
curl "https://refnusa.dev/v1/faostat/indonesia?series=undernourishment_pct"await fetch("https://refnusa.dev/v1/faostat/indonesia?series=undernourishment_pct").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/faostat/indonesia", params={"series":"undernourishment_pct"}).json(){
"series": "undernourishment_pct",
"source": "FS",
"item": "Prevalence of undernourishment (percent) (3-year average)",
"element": "Value",
"unit": "%",
"publisher": "FAO (FAOSTAT)",
"source_instrument": "FAOSTAT Suite of Food Security Indicators (FS), area 101 Indonesia",
"source_url": "https://www.fao.org/faostat/en/#data/FS",
"count": 24,
"values": [
{
"period": "2000-2002",
"value": 18.1,
"flag": "E"
},
{
"period": "2001-2003",
"value": 18.1,
"flag": "E"
},
{
"period": "2002-2004",
"value": 18,
"flag": "E"
},
// 21 more
]
}POST /v1/validate/nik
Checks the structure of a 16-digit NIK and looks up its region digits in the wilayah table. Send the NIK in the JSON body; it is never logged.
| Name | Type | Required | Description |
|---|---|---|---|
nik | string | Required | The 16-digit NIK |
Made-up example number.
curl -X POST https://refnusa.dev/v1/validate/nik \
-H "content-type: application/json" \
-d '{"nik":"3171010101900001"}'await fetch("https://refnusa.dev/v1/validate/nik", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({"nik":"3171010101900001"})
}).then((r) => r.json());import requests
requests.post("https://refnusa.dev/v1/validate/nik", json={"nik":"3171010101900001"}).json(){
"format_valid": true,
"region_found": true,
"province": "Daerah Khusus Ibukota Jakarta",
"kabupaten_kota": "Kota Administrasi Jakarta Pusat",
"kecamatan": "Gambir",
"sex": "male",
"birth": {
"day": 1,
"month": 1,
"year_2digit": "90"
},
"structure_source": "Peraturan Pemerintah Republik Indonesia Nomor 40 Tahun 2019 tentang Pelaksanaan Undang-Undang Nomor 23 Tahun 2006 tentang Administrasi Kependudukan sebagaimana telah diubah dengan Undang-Undang Nomor 24 Tahun 2013 tentang Perubahan atas Undang-Undang Nomor 23 Tahun 2006 tentang Administrasi Kependudukan, Pasal 31 ayat (1) (https://peraturan.bpk.go.id/Details/108801/pp-no-40-tahun-2019)",
"source_instrument": "Kepmendagri No 300.2.2-2138 Tahun 2025 as stated in the header of cahyadsn/wilayah db/wilayah.sql (the repository README cites No 300.2.2-2430 Tahun 2025), commit 55a496d, MIT",
"effective_date": "2026-02-13"
}GET /v1/validate/plate
Checks the format of an Indonesian vehicle plate and names the region of its prefix when the prefix table is loaded.
| Name | Type | Required | Description |
|---|---|---|---|
plate | string | Required | Plate such as B 1234 XYZ |
curl "https://refnusa.dev/v1/validate/plate?plate=B+1234+XYZ"await fetch("https://refnusa.dev/v1/validate/plate?plate=B+1234+XYZ").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/validate/plate", params={"plate":"B 1234 XYZ"}).json(){
"valid": true,
"plate": "B 1234 XYZ",
"prefix": "B",
"region_name": "Daerah Khusus Ibukota Jakarta; Kab. Kepulauan Seribu; Kota Depok; Kota Bekasi; Kab. Bekasi; Kota Tangerang; Kota Tangerang Selatan",
"source_instrument": "Peraturan Kepolisian Negara Republik Indonesia Nomor 7 Tahun 2021 tentang Registrasi dan Identifikasi Kendaraan Bermotor, Lampiran huruf A (Penentuan kode wilayah berdasarkan wilayah Regident Ranmor)",
"effective_date": "2021-05-05"
}GET /v1/calc/net-salary
Estimated take-home pay from a monthly gross salary: worker BPJS deductions (JHT, JP, JKN), PPh 21 by the PP 58/2023 TER table or the December annual recalculation, and the employer's own contributions, each line with its decree. Give gross, or regency_code to use that kabupaten/kota UMK. An estimate; the employer payslip decides.
| Name | Type | Required | Description |
|---|---|---|---|
gross | integer | Optional | Monthly gross salary in rupiah; omit when regency_code is given |
regency_code | string | Optional | Use this kabupaten/kota newest UMK as the gross, optional (like 32.73) |
ptkp | string | Required | PTKP status |
jkk_band | string | Optional | JKK risk band of the employer; default sangat_rendah (the lowest band, 0,24%) |
jp | string | Optional | Whether Jaminan Pensiun applies, default true |
jkn | string | Optional | Whether BPJS Kesehatan applies, default true |
jp_cap | integer | Optional | JP wage cap in rupiah; default is the stored 2026 cap (Rp10.547.400), give it to use another |
month | string | Optional | monthly (TER, January to November) or december (annual recalculation), default monthly |
jkn_employer_taxable | string | Optional | Count the employer JKN premium as taxable income, default true |
curl "https://refnusa.dev/v1/calc/net-salary?gross=10000000&ptkp=TK%2F0"await fetch("https://refnusa.dev/v1/calc/net-salary?gross=10000000&ptkp=TK%2F0").then((r) => r.json());import requests
requests.get("https://refnusa.dev/v1/calc/net-salary", params={"gross":10000000,"ptkp":"TK/0"}).json(){
"month": "monthly",
"gross_idr": 10000000,
"ptkp": "TK/0",
"worker_deductions": [
{
"code": "JHT",
"label": "Jaminan Hari Tua (JHT)",
"payer": "worker",
"base_idr": 10000000,
"cap_idr": null,
"capped": false,
"rate_percent": 2,
"amount_idr": 200000,
"source_instrument": "Peraturan Pemerintah Nomor 46 Tahun 2015 tentang Penyelenggaraan Program Jaminan Hari Tua, Pasal 16 ayat (1)",
"source_url": "https://peraturan.bpk.go.id/Download/28934/PP%20Nomor%2046%20Tahun%202015.pdf",
"effective_date": "2015-07-01"
},
{
"code": "JP",
"label": "Jaminan Pensiun (JP)",
"payer": "worker",
"base_idr": 10000000,
"cap_idr": 10547400,
"capped": false,
"rate_percent": 1,
"amount_idr": 100000,
"source_instrument": "Peraturan Pemerintah Nomor 45 Tahun 2015 tentang Penyelenggaraan Program Jaminan Pensiun, Pasal 28 ayat (3)",
"source_url": "https://peraturan.bpk.go.id/Download/28931/PP%20Nomor%2045%20Tahun%202015.pdf",
"effective_date": "2015-07-01"
},
{
"code": "JKN",
"label": "BPJS Kesehatan (JKN)",
"payer": "worker",
"base_idr": 10000000,
"cap_idr": 12000000,
"capped": false,
"rate_percent": 1,
"amount_idr": 100000,
"source_instrument": "Peraturan Presiden Nomor 64 Tahun 2020 tentang Perubahan Kedua atas Peraturan Presiden Nomor 82 Tahun 2018 tentang Jaminan Kesehatan, Pasal 30 ayat (1) and Pasal 32 ayat (1); the Rp12.000.000 cap is restated in Peraturan Presiden Nomor 59 Tahun 2024, Pasal 32 ayat (1)",
"source_url": "https://peraturan.bpk.go.id/Download/127554/Perpres%20Nomor%2064%20Tahun%202020.pdf",
"effective_date": "2020-05-06"
}
],
"worker_deductions_total_idr": 400000,
"pph21": {
"method": "ter",
"ter_category": "A",
"taxable_gross_idr": 10440000,
"ter_rate_percent": 2.5,
"ter_bracket": {
"lower_idr": 10350001,
"upper_idr": 10700000
},
"ter_tax_idr": 261000,
"source_instrument": "Peraturan Pemerintah Nomor 58 Tahun 2023 tentang Tarif Pemotongan Pajak Penghasilan Pasal 21 atas Penghasilan Sehubungan dengan Pekerjaan, Jasa, atau Kegiatan Wajib Pajak Orang Pribadi, Lampiran huruf A, B, dan C (Tarif Efektif Bulanan)",
"source_url": "https://peraturan.bpk.go.id/Download/332609/PP%20Nomor%2058%20Tahun%202023.pdf",
"effective_date": "2024-01-01",
"amount_idr": 261000,
"warnings": [],
"employer_premiums_in_gross_idr": 440000
},
"take_home_idr": 9339000,
"employer_contributions": [
{
"code": "JHT",
"label": "Jaminan Hari Tua (JHT)",
"payer": "employer",
"base_idr": 10000000,
"cap_idr": null,
"capped": false,
"rate_percent": 3.7,
"amount_idr": 370000,
"source_instrument": "Peraturan Pemerintah Nomor 46 Tahun 2015 tentang Penyelenggaraan Program Jaminan Hari Tua, Pasal 16 ayat (1)",
"source_url": "https://peraturan.bpk.go.id/Download/28934/PP%20Nomor%2046%20Tahun%202015.pdf",
"effective_date": "2015-07-01"
},
{
"code": "JP",
"label": "Jaminan Pensiun (JP)",
"payer": "employer",
"base_idr": 10000000,
"cap_idr": 10547400,
"capped": false,
"rate_percent": 2,
"amount_idr": 200000,
"source_instrument": "Peraturan Pemerintah Nomor 45 Tahun 2015 tentang Penyelenggaraan Program Jaminan Pensiun, Pasal 28 ayat (3)",
"source_url": "https://peraturan.bpk.go.id/Download/28931/PP%20Nomor%2045%20Tahun%202015.pdf",
"effective_date": "2015-07-01"
},
{
"code": "JKK",
"label": "Jaminan Kecelakaan Kerja (JKK), risiko sangat rendah",
"payer": "employer",
"base_idr": 10000000,
"cap_idr": null,
"capped": false,
"rate_percent": 0.1,
"amount_idr": 10000,
"source_instrument": "Peraturan Pemerintah Nomor 6 Tahun 2025 tentang Perubahan atas Peraturan Pemerintah Nomor 37 Tahun 2021 tentang Penyelenggaraan Program Jaminan Kehilangan Pekerjaan, Pasal I angka 2 (Pasal 11 ayat (5))",
"source_url": "https://peraturan.bpk.go.id/Download/375603/PP%20Nomor%206%20Tahun%202025.pdf",
"effective_date": "2025-02-07"
},
// 2 more
],
"employer_contributions_total_idr": 1010000,
"employer_total_cost_idr": 11010000,
"assumptions": [
"Gaji bruto dianggap sama setiap bulan dan seluruhnya menjadi dasar iuran BPJS.",
"Hanya satu bulan antara Januari dan November yang dihitung, dengan tarif efektif bulanan.",
"Premi JKK, JKM dan JKN yang dibayar pemberi kerja dihitung sebagai penghasilan bruto untuk PPh 21."
],
"warnings": []
}MCP server
Refnusa is a remote MCP server at https://refnusa.dev/mcp over Streamable HTTP, with the same data as the REST API.
claude mcp add --transport http refnusa https://refnusa.dev/mcpClaude.ai
- Settings
- Connectors
- Add custom connector
- Paste
https://refnusa.dev/mcp
{
"mcpServers": {
"refnusa": {
"type": "http",
"url": "https://refnusa.dev/mcp"
}
}
}Example call
A tools/call request for get_ump, and its real result.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_ump",
"arguments": {
"year": 2026,
"province_code": "31"
}
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"year\":2026,\"ump\":[{\"province_code\":\"31\",\"province_name\":\"DKI Jakarta\",\"amount_idr\":5729876,\"source_instrument\":\"Keputusan Gubernur Nomor 1142 Tahun 2025 tentang Upah Minimum Provinsi Tahun 2026\",\"effective_date\":\"2026-01-01\",\"source_url\":\"https://jdih.jakarta.go.id/dokumen/detail/14763\"}]}"
}
],
"structuredContent": {
"year": 2026,
"ump": [
{
"province_code": "31",
"province_name": "DKI Jakarta",
"amount_idr": 5729876,
"source_instrument": "Keputusan Gubernur Nomor 1142 Tahun 2025 tentang Upah Minimum Provinsi Tahun 2026",
"effective_date": "2026-01-01",
"source_url": "https://jdih.jakarta.go.id/dokumen/detail/14763"
}
]
}
}
}Tools
list_datasetsNone
Coverage and status of every dataset: status, row count, source instrument, effective date, publisher, official source URL, last check, data period, cadence, maximum age, next expected update, and the catalogue page. The licence, caveat and fallback fields are Indonesian text.
get_holidaysyear
Public holidays (libur nasional) and joint leave days (cuti bersama) for one year, from that year's SKB 3 Menteri decree.
check_holidaydate
Whether one date is a public holiday or cuti bersama, with the decree it was checked against. Weekends count only when the decree names them.
get_umpyear (optional), province_code (optional)
Provincial minimum wage (UMP) for one year (default: the newest loaded), all provinces or one province. For 2026, 29 provinces cite the governor decree and 9 the BPS table; 1997 to 2025 rows cite the BPS yearly table (2017 and Jawa Barat 2016: BPS Statistik Indonesia 2018, Tabel 3.2.23).
get_ump_historyprovince_code (optional)
Every loaded year of the provincial minimum wage (UMP) for one province, oldest first, each row with its source (governor decree or BPS table) and URL. 1997 to 2026. Without province_code: the same rows for all provinces in one response, ordered by province then year (for charts and bulk analysis).
get_umkyear (optional), regency_code (optional), province_code (optional)
Regency or city minimum wage (UMK) for one year. With regency_code: that kabupaten/kota (default year: its newest). Without it: every kabupaten/kota with a confirmed figure for the year (default: the newest loaded), in one response, optionally limited to one province_code.
get_umk_historyregency_code
Every loaded year of the regency or city minimum wage (UMK) for one kabupaten/kota, oldest first, each row with its source instrument and URL: a governor decree, or for some regions the open-data portal of the regional government (source_instrument then starts with Portal and notes that the dataset has no decree number). Covers Jawa Barat 2023 to 2026, Jawa Tengah 2022 to 2026, Jawa Timur 2024 to 2026, a few Riau and Bali regions for 2024, Kalimantan Barat (2019, 2022, 2025), Banten (2020 to 2024), seven Sumatera Selatan regions (2024), five Kalimantan Timur regions (Berau, Kutai Barat, Kutai Timur, Penajam Paser Utara, Samarinda), six Magelang-area regions 2014 to 2020, Kota Tegal 2021 and Rembang (2010, 2019). Where no decree or portal row exists, BPS provincial tables fill in (source_instrument then starts with BPS table, one amount per year, no decree number or effective date): Sumatera Utara 2015 to 2024, Kepulauan Riau 2016 to 2025, Jawa Tengah 2017 to 2021, Banten 2014 to 2019, Nusa Tenggara Timur 2016 to 2025 (not 2019), Lampung 2017 to 2025, DI Yogyakarta 2016 to 2025, plus UMK 2026 for Nusa Tenggara Timur and 12 Lampung regions.
get_wilayahlevel (optional), parent_code (optional), code (optional)
Administrative regions: the 38 provinces, the children of one parent code, or one region by code.
get_postal_codewilayah_code
Postal codes of one kelurahan or desa by its wilayah code.
reverse_postal_codepostal_code
Regions (kelurahan or desa) that carry one postal code.
get_pph21_tercategory, income_idr
PPh 21 effective average rate (TER) bracket for a monthly gross income and TER category A, B or C, per PP 58/2023.
get_ptkpstatus
Annual non-taxable income (PTKP) for a taxpayer status such as TK/0 or K/1.
get_prayer_timescity_code, date
Prayer times for one kabupaten/kota and date, computed by a documented hisab method; not an official Kemenag feed.
get_bpjs_ratesprogram (optional), status (optional)
BPJS contribution rates as a percent of monthly wage, per program (JHT, JP, JKK, JKM, JKP, JKN), with the decree behind each rate. JKK serves the PP 6/2025 bands; the 2026 JP wage cap is Rp10.547.400 (the BPJS article 18913 says Rp10.547.000, see the row note).
get_bank_codescode (optional), name (optional)
Three-digit bank codes (Sandi Bank) of the commercial and sharia banks on the OJK head-office list of June 2026, by code or by part of the bank name; no argument lists all 105.
get_fuel_pricesfuel (optional)
Retail price per litre of the subsidised and special-assignment fuels (Solar, minyak tanah, RON 90) from Kepmen ESDM 218.K/MG.01/MEM.M/2022. Non-subsidised fuels are not included.
list_food_commoditiesNone
The 10 staple food groups and their 21 items that PIHPS Nasional (Bank Indonesia) reports per province, with code, Indonesian and English name, unit (Rp/kg), the markets (tradisional, modern) that have a price on the newest day, and for the groups the first and last month of the monthly series.
get_food_prices_latestcommodity (optional), market (optional), province_code (optional), month (optional)
Latest PIHPS Nasional (Bank Indonesia) price of a staple food per province, in Rp/kg, on the newest observation day, plus PIHPS national averages. Covers the 10 groups and 21 items. Without market you get one row per province and commodity: the traditional-market (tradisional) price when it exists, otherwise the modern-market price; each row names its market and day. Traditional markets report for fewer provinces than modern ones. Pass market for one market only. Filter by commodity, province and market. With month (YYYY-MM): the monthly series price instead, for the 10 groups in traditional markets only.
get_food_price_seriescommodity, province_code, from (optional), to (optional)
Monthly PIHPS Nasional (Bank Indonesia) price series, in Rp/kg, for one province and one staple food from May 2017; each point is the price on the first day of the month with data (observed_on). Optional from and to months.
get_passport_feescategory (optional), fee_code (optional)
Imigrasi PNBP fees from PP 45/2024: passport (biasa 5 and 10 years, electronic and non-electronic, SPLP, same-day service) and visa kunjungan (single and multiple trip). Government fee only.
search_kbliq (optional), level (optional), limit (optional)
Search the KBLI 2020 business-field classification (Peraturan BPS 2/2020) by part of the title or a code prefix, optionally one of its five levels (kategori, golongan_pokok, golongan, subgolongan, kelompok). Returns code, level, parent and title; fetch one code for its description.
get_kblicode
One KBLI 2020 entry by code (a letter A to U, or 2, 3, 4 or 5 digits) with its description, its ancestors up to the kategori and its children.
get_tax_ratescategory (optional), rate_code (optional)
Tax and duty rates, each with its decree: PPN 12% and the 11/12 DPP (PMK 131/2024), Bea Meterai tariff and threshold (UU 10/2020), and the domestic cukai hasil tembakau table (PMK 97/2024 Lampiran I).
get_ojol_tariffszone_code (optional)
Ride-hailing motorbike fare limits per zone (per-km lower and upper bound, minimum fare for the first 4 km) from KP 667/2022. A 2026 decision may supersede it; see the dataset note.
get_zakatcategory (optional), zakat_code (optional)
BAZNAS RI 2026 zakat figures: fitrah (SK 14/2026) and the nisab and rate of zakat penghasilan dan jasa (SK 15/2026).
get_het_pricescommodity (optional), region (optional)
Harga eceran tertinggi: beras medium and premium by wilayah (Keputusan Kepala Bapanas 299/2025, 22 Aug 2025) and LPG 3 kg in Jawa Timur (Kepgub 801/2024).
list_stat_indicatorsNone
Regional statistics from BPS tables: the indicator ids with unit, level (province or kabupaten/kota), every period available, source table and caveats. Includes unemployment (TPT), poverty and poverty lines, HDI (IPM), wages, population, GRDP per capita, life expectancy and monthly inflation and CPI (inflation_mom, inflation_yoy, inflation_ytd, cpi for provinces; inflation_yoy_regency for CPI cities; periods YYYY-MM from 2024-01, base 2022=100). Start here, then call get_stat_values or get_stat_series.
get_stat_valuesindicator, period (optional)
One BPS indicator for one period across all regions in a single call (for a map), plus the national figure. Period is YYYY or YYYY-MM as listed by list_stat_indicators; omit it for the latest. A bare year on a semester indicator resolves to the latest period in that year.
get_stat_seriesindicator, region_code
The time series of one BPS indicator for one region: a province (2 digits), a kabupaten/kota (5 characters like 32.73, hdi_regency and inflation_yoy_regency only) or 00 for Indonesia.
get_fao_indonesiaseries (optional)
FAOSTAT series for Indonesia: undernourishment, food insecurity, dietary energy and protein supply, and the supply of main staples (rice, wheat, maize, cassava, sugar, vegetable oils, soyabeans, poultry, eggs, fish). FAO methodology and population estimates, not comparable with BPS figures. Call without series for the list, then with series for the values.
validate_niknik
Checks the structure of a 16-digit NIK and looks up its region digits in the wilayah table. Send the NIK in the JSON body; it is never logged.
validate_plateplate
Checks the format of an Indonesian vehicle plate and names the region of its prefix when the prefix table is loaded.
calculate_net_salarygross (optional), regency_code (optional), ptkp, jkk_band (optional), jp (optional), jkn (optional), jp_cap (optional), month (optional), jkn_employer_taxable (optional)
Estimated take-home pay from a monthly gross salary: worker BPJS deductions (JHT, JP, JKN), PPh 21 by the PP 58/2023 TER table or the December annual recalculation, and the employer's own contributions, each line with its decree. Give gross, or regency_code to use that kabupaten/kota UMK. An estimate; the employer payslip decides.
Sources and changelog
Each dataset follows the instrument that sets it. Holidays and cuti bersama come from the yearly joint decree of three ministers (SKB 3 Menteri). Minimum wages come from each governor's decree. Kalimantan Timur publishes its 2026 figure as a governor's announcement (Pengumuman Gubernur), and that row cites it. Region codes follow the Kepmendagri wilayah decree through the cahyadsn/wilayah dataset, and postal codes come from cahyadsn/wilayah_kodepos, both under the MIT licence. The PPh 21 effective rates follow PP 58/2023 and the PTKP amounts follow PMK 101/PMK.010/2016. Prayer times are computed with a documented hisab method and are not an official Kemenag feed.
Each dataset has a page with its publisher, source link, licence, last check, fallback rule and CSV, JSON and XLSX downloads: see the data catalogue. Changes are published as an Atom feed, and Sorotan data turns the figures into five short stories.
Added 44 BPS indicators to the 16 already loaded, 60 in all: economy (GRDP and growth, Gini, poverty depth and severity), employment (labour force participation, underemployment, informal work, net wages by education, age and occupation) and food (calorie and protein intake, household spending, rice area, yield and production). FAOSTAT for Indonesia (49 series, dataset faostat_idn) is listed at /data/fao-indonesia/ and served by /v1/faostat/indonesia and the get_fao_indonesia tool.
Added 697 kabupaten/kota minimum wage (UMK) rows from seven BPS provincial tables: 694 history rows (Sumatera Utara 2015-2024, Kepulauan Riau 2016-2025, Jawa Tengah 2017-2021, Banten 2014-2019, Nusa Tenggara Timur 2016-2025 without 2019, Lampung 2017-2025, DI Yogyakarta 2016-2025) and 3 UMK 2026 rows (Lampung 2, Nusa Tenggara Timur 1) that have no decree row yet. BPS cells equal to that year's provincial UMP (280 region-years, 31 of them for 2026) are left out and listed in umk-history.json under bps_excluded_equal_ump: those kabupaten most likely set no UMK and BPS lists the UMP. A decree or portal row always wins over a BPS row. BPS prints one amount per year without a decree number or effective date. UMK 2026 now covers 139 of 514 kabupaten/kota (128 decree or portal rows, 8 Banten decree rows, 3 BPS rows).
Loaded 49 FAOSTAT series for Indonesia (food security indicators and staple supply), FAO methodology.
Added 5 monthly inflation indicators, January 2024 to September 2026 (10,065 values): month-to-month, year-on-year and year-to-date inflation and the CPI for 38 provinces plus the national row, and year-on-year inflation for 149 kabupaten/kota CPI cities. The CPI levels agree with the three inflation series within rounding. Refreshed by hand every month. The March 2026 poverty line was already held and matched the WebAPI table.
Added all eight Banten kabupaten/kota for 2026 (Pandeglang, Lebak, Tangerang, Serang, Kota Tangerang, Cilegon, Serang, Tangerang Selatan; 136 rows in all) from the decree PDF on ppid.bantenprov.go.id, signed 24 December 2025, in force 1 January 2026. Kalimantan Timur (9) and the three Sulawesi Tenggara decrees (Kolaka, Kendari, Konawe Utara) were already loaded and re-checked against the saved sources; the Kaltim rows cite the Pengumuman Gubernur 500.15.14.1/5096/DTKT.Srk-IV/2025, not a Keputusan.
Replaced the rice HET rows with Keputusan Kepala Bapanas 299/2025, read from the official PDF: medium rose to Rp13.500 to Rp15.500 per kg by wilayah, premium unchanged (Rp14.900 to Rp15.800). Removed the needs-checking flag.
get_food_prices_latest without market now reads the latest daily snapshot: one row per province and commodity, the traditional-market price when it exists, otherwise the modern-market price; each row names its market. Pass market to get one market only.
Added the provincial minimum wage (UMP) for 2017 for all 34 provinces, and Jawa Barat 2016 (1,312,355; the earlier 2,250,000 was a transcription error and is gone from the dropped list). BPS prints one amount per year without an effective date. The yearbook prints Riau 2016 as 2,093,970; the history keeps 2,095,000 from the BPS web table.
Added poverty_rate and poverty_count for 2026-03 (39 rows each: 38 provinces and the national row 00) from the BPS WebAPI. Before loading, every period the API and our saved tables both hold was compared for 11 indicators (1,000+ province values): all agree within rounding except hdi_province 2024, where the API series (new method, matches the kabupaten/kota basis) differs from the saved province table, so it was not loaded. No other indicator had a newer period. hdi_regency (var 413 returned province rows), income_informal_net (var 2465 is own-account workers only), population_census and population_projection were not loaded.
Added a snapshot of the newest observation day (14 October 2026): 31 commodity codes in traditional and modern markets with PIHPS national averages, 1,431 rows. Traditional markets report for 12 to 13 provinces per item and modern markets for 26 to 34 (one item, bulk cooking oil 9_17, for 5), so coverage differs by market. The monthly series of the 10 groups in traditional markets is unchanged.
Limits and errors
The free tier has no monthly cap. Each client may send 60 requests a minute; past that the API answers 429 with a Retry-After header.
| Code | Status | Meaning |
|---|---|---|
invalid_parameter | 400 | A parameter is missing or fails validation. |
bad_json | 400 | The request body is not valid JSON. |
not_found | 404 | No record matches the request. |
dataset_not_loaded | 404 | The dataset behind this route is not loaded yet. |
body_too_large | 413 | The request body is over 64 KB. |
rate_limited | 429 | The client has passed 60 requests in the last minute. |
server_error | 500 | An unexpected error; nothing about the request caused it. |