Refnusa

Reference data API

Indonesian reference data API

Public holidays, minimum wages, region and postal codes, income tax tables, prayer times, and NIK and plate checks for Indonesia, over REST and MCP. Every record names the regulation it comes from and the date that regulation took effect.

QuickstartREST referenceDatasets

Ringkasan dalam bahasa Indonesia

PetaMinimum wages and food prices by province and regency, on a map. GrafikCharts of UMP since 1997, tax rates, BPJS, fuel and more, with data tables. KalkulatorTake-home pay, PPh 21 and BPJS, with the rule shown on every line. WidgetEmbed prayer times or UMP on your own site with one snippet.

Quickstart

Connect an MCP client or send a first request. No key, no sign-up.

Connect from Claude Code
claude mcp add --transport http refnusa https://refnusa.dev/mcp
Base URL
https://refnusa.dev
GET /v1/holidays/2026-08-17
{
  "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.

DatasetSourceCoverageStatus

Public holidays and cuti bersama

holidays
SKB 3 Menteri, one decree per year; each row names its own
Full source

SKB 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 file
Full source

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

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 own
Full source

Keputusan 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, MIT
Full source

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

Complete
Loaded

Postal codes per kelurahan and desa

postal_codes
cahyadsn/wilayah_kodepos json/wilayah_kodepos.json, commit ba84971, MIT
Full source

cahyadsn/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 source

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)

Complete
Loaded

Non-taxable income (PTKP)

tax_ptkp
Peraturan Menteri Keuangan Nomor 101/PMK.010/2016 tentang Penyesuaian Besarnya Penghasilan Tidak Kena Pajak
Full source

Peraturan 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 source

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.

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 source

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)

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 source

OJK, 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 Penugasan
Full source

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

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 source

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)

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 2020
Full source

Peraturan 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 row
Full source

3 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 II
Full source

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

2022 zone table; 2026 decision not found
Partial

Zakat fitrah and nisab, BAZNAS 2026

zakat
2 instruments, named on each row
Full source

2 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 row
Full source

2 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 Indonesia
Full source

PIHPS 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 own
Full source

PP 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 source

BPS 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 101
Full source

FAOSTAT 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
curl "https://refnusa.dev/v1/datasets"
JavaScript
await fetch("https://refnusa.dev/v1/datasets").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/datasets").json()
200 OK
{
  "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.

NameTypeRequiredDescription
yearintegerRequiredCalendar year, for example 2026
cURL
curl "https://refnusa.dev/v1/holidays?year=2026"
JavaScript
await fetch("https://refnusa.dev/v1/holidays?year=2026").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/holidays", params={"year":2026}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
datedateRequiredDate in YYYY-MM-DD form
cURL
curl "https://refnusa.dev/v1/holidays/2026-08-17"
JavaScript
await fetch("https://refnusa.dev/v1/holidays/2026-08-17").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/holidays/2026-08-17").json()
200 OK
{
  "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).

NameTypeRequiredDescription
yearintegerOptionalCalendar year, for example 2026; omit for the newest year loaded
province_codestringOptionalKemendagri province code, optional (two digits like 31)
cURL
curl "https://refnusa.dev/v1/wages/ump?year=2026&province_code=31"
JavaScript
await fetch("https://refnusa.dev/v1/wages/ump?year=2026&province_code=31").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/wages/ump", params={"year":2026,"province_code":"31"}).json()
200 OK
{
  "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).

NameTypeRequiredDescription
province_codestringOptionalKemendagri province code; omit for all provinces (two digits like 31)
cURL
curl "https://refnusa.dev/v1/wages/ump/history?province_code=31"
JavaScript
await fetch("https://refnusa.dev/v1/wages/ump/history?province_code=31").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/wages/ump/history", params={"province_code":"31"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
yearintegerOptionalCalendar year, for example 2026; omit for the newest year loaded
regency_codestringOptionalKemendagri kabupaten/kota code; omit to list all (like 32.73)
province_codestringOptionalKemendagri province code; used only when regency_code is omitted (two digits like 32)
cURL
curl "https://refnusa.dev/v1/wages/umk?year=2026&regency_code=32.73"
JavaScript
await fetch("https://refnusa.dev/v1/wages/umk?year=2026&regency_code=32.73").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/wages/umk", params={"year":2026,"regency_code":"32.73"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
regency_codestringRequiredKemendagri kabupaten/kota code (like 32.73)
cURL
curl "https://refnusa.dev/v1/wages/umk/history?regency_code=32.73"
JavaScript
await fetch("https://refnusa.dev/v1/wages/umk/history?regency_code=32.73").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/wages/umk/history", params={"regency_code":"32.73"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
levelstringOptionalLevel to list; anything below provinsi needs parent_code
parent_codestringOptionalList the children of this code (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001)
codestringOptionalReturn this one region (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001)
cURL
curl "https://refnusa.dev/v1/wilayah?parent_code=31"
JavaScript
await fetch("https://refnusa.dev/v1/wilayah?parent_code=31").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/wilayah", params={"parent_code":"31"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
codestringRequiredKemendagri wilayah code (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001)
cURL
curl "https://refnusa.dev/v1/wilayah/31.71.01.1002"
JavaScript
await fetch("https://refnusa.dev/v1/wilayah/31.71.01.1002").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/wilayah/31.71.01.1002").json()
200 OK
{
  "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.

NameTypeRequiredDescription
codestringRequiredPostal code (five digits)
cURL
curl "https://refnusa.dev/v1/postal-codes/reverse?code=10150"
JavaScript
await fetch("https://refnusa.dev/v1/postal-codes/reverse?code=10150").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/postal-codes/reverse", params={"code":"10150"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
wilayah_codestringRequiredKemendagri wilayah code (2, 5, 8 or 13 characters like 31, 31.71, 31.71.01, 31.71.01.1001)
cURL
curl "https://refnusa.dev/v1/postal-codes/31.71.01.1001"
JavaScript
await fetch("https://refnusa.dev/v1/postal-codes/31.71.01.1001").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/postal-codes/31.71.01.1001").json()
200 OK
{
  "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.

NameTypeRequiredDescription
categorystringRequiredTER category A, B or C
income_idrintegerRequiredMonthly gross income in rupiah
cURL
curl "https://refnusa.dev/v1/tax/pph21-ter?category=A&income_idr=10000000"
JavaScript
await fetch("https://refnusa.dev/v1/tax/pph21-ter?category=A&income_idr=10000000").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/tax/pph21-ter", params={"category":"A","income_idr":10000000}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
categorystringOptionalTER category A, B or C; omit for all
cURL
curl "https://refnusa.dev/v1/tax/pph21-ter/brackets?category=A"
JavaScript
await fetch("https://refnusa.dev/v1/tax/pph21-ter/brackets?category=A").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/tax/pph21-ter/brackets", params={"category":"A"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
statusstringRequiredPTKP status code (TK/0 to TK/3, K/0 to K/3, K/I/0 to K/I/3)
cURL
curl "https://refnusa.dev/v1/tax/ptkp?status=K%2F1"
JavaScript
await fetch("https://refnusa.dev/v1/tax/ptkp?status=K%2F1").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/tax/ptkp", params={"status":"K/1"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
city_codestringRequiredKemendagri 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)
datedateRequiredDate in YYYY-MM-DD form
cURL
curl "https://refnusa.dev/v1/prayer-times?city_code=31.71&date=2026-10-01"
JavaScript
await fetch("https://refnusa.dev/v1/prayer-times?city_code=31.71&date=2026-10-01").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/prayer-times", params={"city_code":"31.71","date":"2026-10-01"}).json()
200 OK
{
  "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).

NameTypeRequiredDescription
programstringOptionalProgram; omit for all
statusstringOptionalcurrent (default) or superseded rows, or all
cURL
curl "https://refnusa.dev/v1/bpjs-rates?program=JKK"
JavaScript
await fetch("https://refnusa.dev/v1/bpjs-rates?program=JKK").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/bpjs-rates", params={"program":"JKK"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
codestringOptionalSandi Bank, optional (three digits like 014)
namestringOptionalPart of the bank name, optional
cURL
curl "https://refnusa.dev/v1/bank-codes?code=014"
JavaScript
await fetch("https://refnusa.dev/v1/bank-codes?code=014").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/bank-codes", params={"code":"014"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
fuelstringOptionalkerosene, gas_oil (Solar) or ron90; omit for all three
cURL
curl "https://refnusa.dev/v1/fuel-prices?fuel=gas_oil"
JavaScript
await fetch("https://refnusa.dev/v1/fuel-prices?fuel=gas_oil").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/fuel-prices", params={"fuel":"gas_oil"}).json()
200 OK
{
  "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
curl "https://refnusa.dev/v1/food-prices/commodities"
JavaScript
await fetch("https://refnusa.dev/v1/food-prices/commodities").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/food-prices/commodities").json()
200 OK
{
  "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.

NameTypeRequiredDescription
commoditystringOptionalCommodity code from list_food_commodities (a group or an item), optional; with month, groups only
marketstringOptionaltradisional or modern; omit for one row per province and commodity, tradisional first then modern (with month: tradisional only)
province_codestringOptionalKemendagri province code, optional (Papua and Papua Barat only: 91, 92) (two digits like 31)
monthstringOptionalReturn this month instead of the newest on file, optional (YYYY-MM like 2026-03)
cURL
curl "https://refnusa.dev/v1/food-prices/latest?commodity=beras&province_code=31"
JavaScript
await fetch("https://refnusa.dev/v1/food-prices/latest?commodity=beras&province_code=31").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/food-prices/latest", params={"commodity":"beras","province_code":"31"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
commoditystringRequiredCommodity code from list_food_commodities
province_codestringRequiredKemendagri province code (two digits like 31)
fromstringOptionalFirst month, optional (YYYY-MM like 2026-03)
tostringOptionalLast month, optional (YYYY-MM like 2026-03)
cURL
curl "https://refnusa.dev/v1/food-prices/series?commodity=beras&province_code=31&from=2026-01"
JavaScript
await fetch("https://refnusa.dev/v1/food-prices/series?commodity=beras&province_code=31&from=2026-01").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/food-prices/series", params={"commodity":"beras","province_code":"31","from":"2026-01"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
categorystringOptionalpassport or visa; omit for all
fee_codestringOptionalOne fee by code, optional (lowercase code like passport_biasa_elektronik_10y)
cURL
curl "https://refnusa.dev/v1/passport-fees?category=passport"
JavaScript
await fetch("https://refnusa.dev/v1/passport-fees?category=passport").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/passport-fees", params={"category":"passport"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
qstringOptionalPart of the title, or the start of a code, optional
levelstringOptionalRestrict to one level, optional
limitintegerOptionalMaximum items returned, default 50
cURL
curl "https://refnusa.dev/v1/kbli?q=akuntansi&level=subgolongan"
JavaScript
await fetch("https://refnusa.dev/v1/kbli?q=akuntansi&level=subgolongan").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/kbli", params={"q":"akuntansi","level":"subgolongan"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
codestringRequiredKBLI code (a letter A-U or 2 to 5 digits like 62019)
cURL
curl "https://refnusa.dev/v1/kbli/62019"
JavaScript
await fetch("https://refnusa.dev/v1/kbli/62019").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/kbli/62019").json()
200 OK
{
  "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).

NameTypeRequiredDescription
categorystringOptionalppn, bea_meterai or cukai_hasil_tembakau; omit for all
rate_codestringOptionalOne rate by code, optional (lowercase code like ppn_rate)
cURL
curl "https://refnusa.dev/v1/tax-rates?category=ppn"
JavaScript
await fetch("https://refnusa.dev/v1/tax-rates?category=ppn").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/tax-rates", params={"category":"ppn"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
zone_codestringOptionalzona_1, zona_2 or zona_3; omit for all
cURL
curl "https://refnusa.dev/v1/ojol-tariffs?zone_code=zona_2"
JavaScript
await fetch("https://refnusa.dev/v1/ojol-tariffs?zone_code=zona_2").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/ojol-tariffs", params={"zone_code":"zona_2"}).json()
200 OK
{
  "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).

NameTypeRequiredDescription
categorystringOptionalfitrah or penghasilan; omit for all
zakat_codestringOptionalOne figure by code, optional (lowercase code like fitrah_uang)
cURL
curl "https://refnusa.dev/v1/zakat?category=fitrah"
JavaScript
await fetch("https://refnusa.dev/v1/zakat?category=fitrah").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/zakat", params={"category":"fitrah"}).json()
200 OK
{
  "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).

NameTypeRequiredDescription
commoditystringOptionalCommodity; omit for all
regionstringOptionalPart of the region name, for example Kalimantan, optional
cURL
curl "https://refnusa.dev/v1/het-prices?commodity=beras_medium&region=Kalimantan"
JavaScript
await fetch("https://refnusa.dev/v1/het-prices?commodity=beras_medium&region=Kalimantan").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/het-prices", params={"commodity":"beras_medium","region":"Kalimantan"}).json()
200 OK
{
  "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
curl "https://refnusa.dev/v1/stats/indicators"
JavaScript
await fetch("https://refnusa.dev/v1/stats/indicators").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/stats/indicators").json()
200 OK
{
  "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.

NameTypeRequiredDescription
indicatorstringRequiredIndicator id (an id from list_stat_indicators, like unemployment_rate)
periodstringOptionalPeriod, optional (default: latest) (YYYY or YYYY-MM)
cURL
curl "https://refnusa.dev/v1/stats/values?indicator=unemployment_rate&period=2025-08"
JavaScript
await fetch("https://refnusa.dev/v1/stats/values?indicator=unemployment_rate&period=2025-08").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/stats/values", params={"indicator":"unemployment_rate","period":"2025-08"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
indicatorstringRequiredIndicator id (an id from list_stat_indicators, like unemployment_rate)
region_codestringRequiredKemendagri region code, or 00 for Indonesia (00, a two-digit province code like 31, or a kabupaten/kota code like 32.73)
cURL
curl "https://refnusa.dev/v1/stats/series?indicator=unemployment_rate&region_code=31"
JavaScript
await fetch("https://refnusa.dev/v1/stats/series?indicator=unemployment_rate&region_code=31").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/stats/series", params={"indicator":"unemployment_rate","region_code":"31"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
seriesstringOptionalSeries id; omit for the list of series (a series id from the list, like undernourishment_pct or rice_supply_kg_cap_yr)
cURL
curl "https://refnusa.dev/v1/faostat/indonesia?series=undernourishment_pct"
JavaScript
await fetch("https://refnusa.dev/v1/faostat/indonesia?series=undernourishment_pct").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/faostat/indonesia", params={"series":"undernourishment_pct"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
nikstringRequiredThe 16-digit NIK

Made-up example number.

cURL
curl -X POST https://refnusa.dev/v1/validate/nik \
  -H "content-type: application/json" \
  -d '{"nik":"3171010101900001"}'
JavaScript
await fetch("https://refnusa.dev/v1/validate/nik", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({"nik":"3171010101900001"})
}).then((r) => r.json());
Python
import requests

requests.post("https://refnusa.dev/v1/validate/nik", json={"nik":"3171010101900001"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
platestringRequiredPlate such as B 1234 XYZ
cURL
curl "https://refnusa.dev/v1/validate/plate?plate=B+1234+XYZ"
JavaScript
await fetch("https://refnusa.dev/v1/validate/plate?plate=B+1234+XYZ").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/validate/plate", params={"plate":"B 1234 XYZ"}).json()
200 OK
{
  "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.

NameTypeRequiredDescription
grossintegerOptionalMonthly gross salary in rupiah; omit when regency_code is given
regency_codestringOptionalUse this kabupaten/kota newest UMK as the gross, optional (like 32.73)
ptkpstringRequiredPTKP status
jkk_bandstringOptionalJKK risk band of the employer; default sangat_rendah (the lowest band, 0,24%)
jpstringOptionalWhether Jaminan Pensiun applies, default true
jknstringOptionalWhether BPJS Kesehatan applies, default true
jp_capintegerOptionalJP wage cap in rupiah; default is the stored 2026 cap (Rp10.547.400), give it to use another
monthstringOptionalmonthly (TER, January to November) or december (annual recalculation), default monthly
jkn_employer_taxablestringOptionalCount the employer JKN premium as taxable income, default true
cURL
curl "https://refnusa.dev/v1/calc/net-salary?gross=10000000&ptkp=TK%2F0"
JavaScript
await fetch("https://refnusa.dev/v1/calc/net-salary?gross=10000000&ptkp=TK%2F0").then((r) => r.json());
Python
import requests

requests.get("https://refnusa.dev/v1/calc/net-salary", params={"gross":10000000,"ptkp":"TK/0"}).json()
200 OK
{
  "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 Code
claude mcp add --transport http refnusa https://refnusa.dev/mcp

Claude.ai

  1. Settings
  2. Connectors
  3. Add custom connector
  4. Paste https://refnusa.dev/mcp
JSON config
{
  "mcpServers": {
    "refnusa": {
      "type": "http",
      "url": "https://refnusa.dev/mcp"
    }
  }
}

Example call

A tools/call request for get_ump, and its real result.

Request
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_ump",
    "arguments": {
      "year": 2026,
      "province_code": "31"
    }
  }
}
Response
{
  "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_datasets

    None

    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_holidays

    year

    Public holidays (libur nasional) and joint leave days (cuti bersama) for one year, from that year's SKB 3 Menteri decree.

  • check_holiday

    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.

  • get_ump

    year (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_history

    province_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_umk

    year (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_history

    regency_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_wilayah

    level (optional), parent_code (optional), code (optional)

    Administrative regions: the 38 provinces, the children of one parent code, or one region by code.

  • get_postal_code

    wilayah_code

    Postal codes of one kelurahan or desa by its wilayah code.

  • reverse_postal_code

    postal_code

    Regions (kelurahan or desa) that carry one postal code.

  • get_pph21_ter

    category, 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_ptkp

    status

    Annual non-taxable income (PTKP) for a taxpayer status such as TK/0 or K/1.

  • get_prayer_times

    city_code, date

    Prayer times for one kabupaten/kota and date, computed by a documented hisab method; not an official Kemenag feed.

  • get_bpjs_rates

    program (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_codes

    code (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_prices

    fuel (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_commodities

    None

    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_latest

    commodity (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_series

    commodity, 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_fees

    category (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_kbli

    q (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_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.

  • get_tax_rates

    category (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_tariffs

    zone_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_zakat

    category (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_prices

    commodity (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_indicators

    None

    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_values

    indicator, 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_series

    indicator, 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_indonesia

    series (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_nik

    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.

  • validate_plate

    plate

    Checks the format of an Indonesian vehicle plate and names the region of its prefix when the prefix table is loaded.

  • calculate_net_salary

    gross (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.

  • 2026-10-21 stats

    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.

  • 2026-10-21 wages_umk

    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).

  • 2026-10-20 faostat_idn

    Loaded 49 FAOSTAT series for Indonesia (food security indicators and staple supply), FAO methodology.

  • 2026-10-20 stats

    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.

  • 2026-10-20 wages_umk

    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.

  • 2026-10-20 het_prices

    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.

  • 2026-10-14 food_prices

    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.

  • 2026-10-14 ump_history

    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.

  • 2026-10-14 bps_stats

    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.

  • 2026-10-14 food_prices

    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.

CodeStatusMeaning
invalid_parameter400A parameter is missing or fails validation.
bad_json400The request body is not valid JSON.
not_found404No record matches the request.
dataset_not_loaded404The dataset behind this route is not loaded yet.
body_too_large413The request body is over 64 KB.
rate_limited429The client has passed 60 requests in the last minute.
server_error500An unexpected error; nothing about the request caused it.