Proxy relay untuk BPS (Badan Pusat Statistik) WebAPI dan AllStats Search yang mem-bypass Cloudflare bot detection menggunakan curl-impersonate Chrome TLS fingerprint.
BPS menggunakan Cloudflare yang memblokir request dari:
- Cloudflare Workers (inter-Cloudflare bot detection)
- Cloud provider IPs (AWS, GCP, Azure, Fly.io, Deno Deploy, dll)
- Serverless functions
- Google Apps Script
Jika kamu mengalami error 403 Forbidden atau halaman "Just a moment..." saat mengakses webapi.bps.go.id dari server/cloud, proxy ini adalah solusinya.
Syarat: Deploy di server dengan IP residential (homelab, VPS dengan IP ISP, Raspberry Pi, dll). Cloud provider IPs tidak akan berhasil.
docker run -d -p 3000:3000 ghcr.io/setiapam/bps-api-proxy:latestTest:
curl http://localhost:3000/health
curl "http://localhost:3000/v1/api/domain/type/all/key/YOUR_BPS_KEY/"services:
bps-proxy:
image: ghcr.io/setiapam/bps-api-proxy:latest
ports:
- "3000:3000"
restart: unless-stopped
# Opsional: untuk AllStats Search (butuh ~512MB RAM)
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
ports:
- "8191:8191"
environment:
- LOG_LEVEL=info
- TZ=Asia/Jakarta
# Jika pakai FlareSolverr, tambahkan env:
# bps-proxy:
# environment:
# - FLARESOLVERR_URL=http://flaresolverr:8191/v1containers:
- name: bps-api-proxy
image: ghcr.io/setiapam/bps-api-proxy:latest
ports:
- containerPort: 3000
env:
- name: FLARESOLVERR_URL
value: "http://flaresolverr-service:8191/v1" # opsional| Path | Target | Method | Deskripsi |
|---|---|---|---|
/health |
- | - | Health check |
/v1/* |
webapi.bps.go.id/v1/* |
curl-impersonate | BPS WebAPI (data statistik) |
/allstats/* |
searchengine.web.bps.go.id/* |
FlareSolverr | AllStats Search (butuh FlareSolverr) |
| Variable | Default | Deskripsi |
|---|---|---|
PORT |
3000 |
Port server |
FLARESOLVERR_URL |
(kosong) | URL FlareSolverr untuk AllStats Search (opsional) |
CURL_BIN |
curl_chrome110 |
Binary curl-impersonate yang digunakan |
Jika kamu deploy bps-mcp-server di Cloudflare Workers, set environment variable:
# wrangler.toml
BPS_API_BASE_URL = "https://your-proxy-domain.com/v1"
BPS_ALLSTATS_BASE_URL = "https://your-proxy-domain.com/allstats/"function getBpsData(endpoint) {
var url = "https://your-proxy-domain.com/v1/api/" + endpoint;
var response = UrlFetchApp.fetch(url);
return JSON.parse(response.getContentText());
}
// Contoh: ambil daftar provinsi
var data = getBpsData("domain/type/prov/key/YOUR_KEY/");Ganti base URL dari https://webapi.bps.go.id/v1 ke http://your-proxy:3000/v1. Semua endpoint BPS WebAPI didukung tanpa perubahan path.
# Python
import requests
BASE = "http://localhost:3000/v1"
r = requests.get(f"{BASE}/api/domain/type/all/key/{API_KEY}/")// Node.js
const BASE = "http://localhost:3000/v1";
const res = await fetch(`${BASE}/api/domain/type/all/key/${API_KEY}/`);Proxy ini harus bisa diakses dari Cloudflare Workers atau service lain. Opsi:
cloudflared tunnel route dns YOUR_TUNNEL bps-api.yourdomain.comDi tunnel config:
- hostname: bps-api.yourdomain.com
service: http://localhost:3000server {
listen 443 ssl;
server_name bps-api.yourdomain.com;
location / {
proxy_pass http://localhost:3000;
proxy_read_timeout 60s;
}
}| Komponen | RAM | CPU | Catatan |
|---|---|---|---|
| bps-api-proxy | ~64MB | Minimal | Wajib |
| FlareSolverr | ~512MB | Low | Opsional, hanya untuk AllStats Search |
- Harus deploy di IP residential — cloud provider IPs diblokir oleh BPS Cloudflare
- AllStats Search membutuhkan FlareSolverr (headless Chrome) — lebih lambat (~5-10 detik per request)
- Tidak ada caching built-in — gunakan caching di level consumer (BPS MCP Server sudah punya cache)
MIT