Tutorial

Cara Ambil Data Resmi BPS Pakai API (Lengkap dengan Contoh Live)

Cara Ambil Data Resmi BPS Pakai API (Lengkap dengan Contoh Live)

Data resmi Badan Pusat Statistik (BPS) bisa diambil langsung lewat Web API di portal webapi.bps.go.id, bukan dengan scraping tabel HTML yang gampang rusak. Dengan satu kunci aplikasi (App Key) dan permintaan HTTP yang benar, satu skrip Python sanggup menarik indikator seperti tingkat kemiskinan nasional, yang pada Semester 2 2025 tercatat 8,25 persen menurut rilis BPS, atau kurs rata-rata Rp/USD yang sebesar 16.162 pada 2024. Panduan ini mengupas langkah lengkapnya, dari registrasi kunci sampai pipeline otomatis yang jalan sendiri di server.

TL;DR

  • Web API BPS diakses lewat portal webapi.bps.go.id dan setiap aplikasi wajib punya App Key sendiri sebelum bisa menarik data.
  • Server BPS dilindungi Web Application Firewall (WAF), jadi permintaan tanpa User-Agent yang wajar sering ditolak dengan HTTP 403 atau 429.
  • Parameter tahun (th) memakai kode internal, misalnya 124 untuk 2024 dan 125 untuk 2025, bukan selalu empat digit kalender.
  • Data rinci dikembalikan di objek datacontent yang bentuknya komposit, sehingga perlu diurai hati-hati sebelum masuk database.
  • Contoh nyata dari snapshot pipeline: kemiskinan nasional 8,25 persen (Semester 2 2025) dan kurs rata-rata 16.162 (2024).

Apa Itu Web API BPS dan Data Apa Saja yang Bisa Diambil?

Web API BPS adalah gerbang resmi yang menyajikan indikator statistik publik dalam format JSON, sehingga aplikasi bisa menarik angka tanpa membuka tabel web manual. Portalnya beralamat di https://webapi.bps.go.id/ dan dikelola langsung oleh BPS sebagai layanan untuk pengembang. Karena keluar dari sistem resmi, angka yang masuk ke dashboard Anda bisa ditelusuri asalnya sampai ke rilis BPS, bukan hasil ketik ulang dari blog pihak ketiga.

Jenis data yang tersedia mencakup indikator makro nasional sampai statistik level kabupaten/kota. Contoh yang paling sering dipakai adalah tingkat kemiskinan nasional, nilai tukar, indeks harga, dan berbagai variabel survei lain. Setiap variabel punya kode unik sendiri, jadi langkah pertama selalu memetakan variabel mana yang mau ditarik.

Struktur rute pemanggilan dibagi dua model utama: model daftar (list) untuk melihat variabel apa saja yang tersedia, dan model data rinci (view) untuk mengambil isi angkanya. Untuk data berskala nasional, kode wilayah diisi 0000, sedangkan level provinsi memakai kode wilayah standar BPS seperti 3100 untuk DKI Jakarta atau 3200 untuk Jawa Barat.

Bagaimana Cara Mendapatkan App Key API BPS?

App Key didapat dengan mendaftar di portal webapi.bps.go.id, lalu mengajukan aplikasi dan menerima kunci unik yang wajib disertakan di setiap permintaan. Kunci ini berfungsi sebagai identitas aplikasi sekaligus alat pengendali kuota akses, jadi perlakuan terhadapnya harus seperti kredensial lain: jangan ditulis di kode yang di-commit, simpan di variabel lingkungan atau file rahasia.

Prosesnya berjalan bertahap. Kunjungi portal resminya, daftar dengan email yang valid, verifikasi email, lalu buka menu registrasi aplikasi. Isi nama aplikasi, deskripsi singkat tujuan pemakaian data, dan URL domain atau alamat IP server yang akan memanggil API. Sistem akan menerbitkan kunci, biasanya berupa rangkaian panjang karakter, yang kemudian dipasang pada tiap endpoint.

Satu catatan praktis: daftarkan domain server produksi, bukan alamat lokal. Kalau nanti pipeline dipindah ke VPS lain, kunci bisa perlu diajukan ulang karena asal permintaan berubah. Menyiapkan kunci terpisah untuk pengembangan dan produksi juga memudahkan pencabutan kalau salah satu bocor.

Bagaimana Menghindari Blokir WAF Saat Memanggil API BPS?

Blokir WAF dihindari dengan menyertakan User-Agent yang wajar dan header HTTP standar di setiap permintaan, bukan dengan mengirim permintaan polos dari pustaka bawaan. Server BPS menerapkan aturan keamanan ketat untuk menahan serangan dan bot scraping liar, sehingga permintaan tanpa identitas yang jelas kerap dibalas HTTP 403 Forbidden atau HTTP 429 Too Many Requests.

Header yang disarankan mencakup User-Agent bergaya peramban modern atau nama bot resmi aplikasi dengan format jelas, misalnya ToolkuyBot/1.0 (+https://toolkuy.com). Tambahkan juga Accept: application/json agar server memprioritaskan payload JSON, dan Accept-Encoding: gzip, deflate supaya transfer lebih hemat bandwidth. Untuk endpoint tertentu yang tidak menyediakan jalur resmi berautentikasi, User-Agent yang jelas sering jadi pembeda antara respons normal dan penolakan.

Pola gagal yang paling sering muncul adalah mengulang permintaan yang sama berkali-kali setelah ditolak. Itu justru memperbesar peluang kena limit. Yang lebih benar: hormati jeda antar permintaan, tangani kode status dengan rapi, dan hentikan percobaan kalau jawabannya konsisten menolak.

Bagaimana Format Parameter Tahun dan Struktur datacontent?

Parameter tahun di API BPS memakai kode internal pada banyak variabel, bukan selalu angka empat digit kalender, sehingga kode th=124 mewakili 2024 dan th=125 mewakili 2025. Selain th, ada parameter turunan variabel (turvar) dan periode turunan (turth) untuk indikator yang dirilis per semester atau per kuartal. Kalau parameter periode dibiarkan kosong, server biasanya mengembalikan seluruh rentang historis yang tersedia.

Bagian yang paling sering bikin pusing adalah objek datacontent. Bentuknya komposit: di dalamnya ada kunci yang mewakili variabel, lalu di bawahnya ada kunci tahun, dan barulah nilai angkanya. Artinya Anda tidak bisa langsung membaca satu angka dari satu field datar, tapi harus menelusuri dua lapis kunci dulu.

```python import json import os import urllib.request

APP_KEY = os.environ["BPS_APP_KEY"]

def ambil_bps(kode_wilayah, kode_var, th=None): url = ("https://webapi.bps.go.id/v1/api/view/model/data/" f"domain/{kode_wilayah}/var/{kode_var}/key/{APP_KEY}/") if th: url += f"th/{th}/" req = urllib.request.Request(url, headers={ "User-Agent": "ToolkuyBot/1.0 (+https://toolkuy.com)", "Accept": "application/json", "Accept-Encoding": "gzip, deflate", }) with urllib.request.urlopen(req, timeout=15) as resp: return json.load(resp)

def ratakan(payload): """Buka dua lapis kunci datacontent jadi baris datar.""" baris = [] for var_id, per_tahun in payload.get("datacontent", {}).items(): for kode_th, nilai in per_tahun.items(): baris.append({"var": var_id, "th": kode_th, "nilai": nilai}) return baris

if name == "main": data = ambil_bps("0000", "192", th="125") for b in ratakan(data): print(b) ```

Fungsi ratakan itu inti triknya. Dengan memecah dua lapis kunci jadi baris datar, hasilnya langsung bisa dimasukkan ke tabel, CSV, atau DataFrame tanpa penanganan khusus.

Contoh Live: Data Kemiskinan dan Kurs Rata-Rata

Angka berikut diambil dari snapshot pipeline internal yang menyalin rilis resmi BPS, jadi bisa dipakai sebagai pembanding saat Anda mengetes skrip sendiri. Tabel di bawah merangkum indikator kemiskinan nasional per semester.

Periode Tingkat Kemiskinan Sumber
Semester 1 2024 (Maret) 9,03 persen BPS, rilis 2026-09-01
Semester 2 2024 (September) 8,57 persen BPS, rilis 2026-09-01
Semester 1 2025 (Maret) 8,47 persen BPS, rilis 2026-09-01
Semester 2 2025 (September) 8,25 persen BPS, rilis 2026-09-01

Pola turunnya konsisten, dari 9,03 persen ke 8,25 persen dalam rentang dua tahun. Untuk kurs, nilai rata-rata tahunan Rp/USD tercatat 15.416 pada 2023 dan 16.162 pada 2024 menurut rilis BPS. Angka ini berguna sebagai titik jangkar saat memeriksa apakah parsing Anda benar: kalau skrip mengembalikan nilai yang jauh berbeda, hampir pasti ada salah kode tahun atau salah variabel.

Perlu dicatat bahwa nilai seperti ini diperbarui berkala. Kemiskinan biasanya rilis per semester, sedangkan kurs per tahun. Pipeline yang sehat menyimpan waktu pengambilan terakhir, bukan hanya angkanya, supaya jelas kapan data itu diambil.

Bagaimana Menjalankan Pipeline Otomatis di VPS?

Pipeline otomatis dijalankan dengan menaruh skrip pengambil data di server lalu menjadwalkannya lewat cron, bukan dengan menjalankan manual tiap kali butuh angka. VPS kecil sudah cukup untuk tugas ini karena beban kerjanya ringan: satu permintaan HTTP, parsing JSON, lalu simpan ke CSV atau database. Yang penting bukan ukuran servernya, tapi kestabilan jadwal dan pencatatan waktu.

Alurnya sederhana. Skrip menulis hasil ke file bertimestamp, lalu job cron memanggilnya secara berkala, misalnya sekali sehari atau sekali seminggu tergantung frekuensi rilis. Setiap keluaran sebaiknya mencantumkan waktu jalan, sehingga kalau suatu hari angkanya tidak berubah, Anda bisa membedakan "memang belum ada rilis baru" dari "skripnya mati diam-diam".

Kalau nanti butuh eksperimen dengan model bahasa untuk merangkum data yang sudah ditarik, layanan berbasis token seperti AI token plan Alibaba Cloud atau platform Qwen bisa jadi opsi, dengan kode referral A924ZV untuk mencobanya. Untuk hosting skrip fetcher dan penyimpanan hasilnya, VPS biasa sudah memadai; yang mahal biasanya bukan komputasinya, tapi kesalahan parsing yang dibiarkan berjalan lama.

Keterbatasan Data

Panduan ini tidak punya data hilang pada snapshot terbaru, jadi semua angka di atas terverifikasi ke rilis BPS. Meski begitu, ada beberapa batasan yang perlu disadari. Pertama, kode tahun internal (th) bisa berbeda antar variabel, jadi kode yang bekerja untuk satu indikator belum tentu sama untuk indikator lain. Kedua, ketersediaan variabel di API bisa berubah saat BPS menambah atau menata ulang dataset.

Ketiga, artikel ini memakai angka sebagai contoh output, bukan sebagai klaim kondisi terkini. Tingkat kemiskinan dan kurs yang ditampilkan berasal dari periode rilis yang disebut di tabel, bukan nilai hari ini. Kalau Anda butuh angka paling baru, jalankan skripnya sendiri ke API resmi dan catat waktu pengambilannya.

Sumber

FAQ

Apakah API BPS bisa dipakai gratis?

Ya, Web API BPS tersedia untuk pengembang yang mendaftar di portal resminya. Anda perlu mengajukan aplikasi untuk mendapatkan App Key, lalu kunci itu dipakai di setiap permintaan. Kuota dan ketentuannya mengikuti aturan yang berlaku di portal.

Kenapa permintaan saya dibalas HTTP 403 oleh server BPS?

Kemungkinan besar permintaan Anda diblokir WAF karena tidak menyertakan User-Agent yang wajar atau header standar. Tambahkan User-Agent yang jelas, Accept: application/json, dan jangan mengirim permintaan bertubi-tubi dalam waktu singkat.

Apa arti kode th 124 dan 125 di API BPS?

Kode th adalah penanda tahun internal yang dipakai sebagian variabel. Nilai 124 mewakili 2024 dan 125 mewakili 2025. Karena tidak semua variabel memakai pola sama, pastikan dulu kode yang benar lewat model daftar sebelum menarik data.

Bagaimana cara membaca objek datacontent yang bentuknya komposit?

Buka kuncinya berlapis. Di dalam datacontent ada kunci variabel, lalu di bawahnya kunci tahun, dan barulah nilai angkanya. Ratakan dua lapis kunci itu menjadi baris datar supaya hasilnya gampang dimasukkan ke tabel atau CSV.

Seberapa sering data BPS di API diperbarui?

Frekuensinya berbeda per indikator. Kemiskinan nasional umumnya rilis per semester, sedangkan kurs rata-rata per tahun. Simpan timestamp setiap kali menarik data supaya Anda tahu kapan angka terakhir diambil.

💬 Komentar (0)

Belum ada komentar. Jadilah yang pertama! 💬

Komentar akan muncul setelah moderasi.