🔴 DEGRADED: This module’s portal (elhkpn.kpk.go.id) now requires authentication. Public search is unavailable as of March 2026.

Module: lhkpn

Source portal: elhkpn.kpk.go.id Scrape method: REST API (search + detail) + pdfplumber + Claude Vision API fallback for PDF extraction Phase: 3 License: MIT Status: ACTIVE


Source

FieldValue
Portal URLhttps://elhkpn.kpk.go.id/portal/user/check_a_lhkpn
OperatorKomisi Pemberantasan Korupsi (KPK RI)
Data typeLHKPN (Laporan Harta Kekayaan Penyelenggara Negara) — public official wealth declarations
Auth requiredNone — public search tier
Last verified2026-03-13

Rate Limits & Block Behaviour

ParameterValue
Safe request rate~0.25 req/s (1 req per 4 seconds)
Block triggerUnknown — needs testing
Block typeTBD (portal is conservative)
MitigationBuilt-in token-bucket rate limiter (0.25 req/s)
IP rotation neededNot required for normal use; supply proxy_url for bulk scraping

Normalized Schema (result object)

{
    "official_name": str,                      # Full name of public official
    "position": str | None,                    # Current position/jabatan
    "ministry": str | None,                    # Instansi/ministry
    "work_unit": str | None,                   # Satuan kerja
    "declaration_year": int | None,            # Year of declaration
    "submission_date": str | None,             # Date submitted
    "declaration_period": str | None,          # Reporting period
    "report_type": str | None,                 # Jenis laporan (annual/periodic)
    "report_number": str | None,               # Official report number
    "report_id": str,                          # Internal KPK report ID
    "total_assets_idr": int | None,            # Total harta in IDR
    "total_liabilities_idr": int | None,       # Total hutang in IDR
    "net_assets_idr": int | None,              # Harta bersih (assets - liabilities)
    "asset_breakdown": {
        "immovable_property_idr": int | None,  # Harta tidak bergerak (land, buildings)
        "movable_property_idr": int | None,    # Harta bergerak (vehicles, goods)
        "securities_idr": int | None,          # Surat berharga (stocks, bonds)
        "cash_idr": int | None,                # Kas & setara kas
        "other_assets_idr": int | None,        # Harta lainnya
    },
    "income_from_position_idr": int | None,    # Penghasilan dari jabatan
    "other_income_idr": int | None,            # Penghasilan lainnya
}

IDR parsing: All monetary values are parsed to int (removing “Rp”, commas, dots).


MCP Tools

ToolSignatureDescription
get_lhkpn(official_name: str) -> dictLook up latest wealth declaration by name
search_lhkpn(ministry_or_name: str) -> list[dict]Search officials by name, ministry, or position
compare_lhkpn(official_id: str, year_a: int, year_b: int) -> dictCompare declarations across years — returns delta
get_lhkpn_pdf(report_id: str) -> dictDownload & extract PDF (requires [pdf] extra)

claude mcp add

claude mcp add civic-stack -- civic-stack-mcp  # all 40 tools

FastAPI Endpoints

MethodPathDescription
GET/lhkpn/official/{name}Look up official’s latest declaration
GET/lhkpn/search?q=keywordSearch officials
GET/lhkpn/compare?official_id=...&year_a=...&year_b=...Compare declarations

Example Response

{
  "result": {
    "official_name": "DR. H. PRABOWO SUBIANTO, M.Si.",
    "position": "Presiden Republik Indonesia",
    "ministry": "Istana Kepresidenan",
    "declaration_year": 2024,
    "submission_date": "2024-12-15",
    "report_type": "Tahunan",
    "report_id": "LHKPN-001234",
    "total_assets_idr": 150000000000,
    "total_liabilities_idr": 5000000000,
    "net_assets_idr": 145000000000,
    "asset_breakdown": {
      "immovable_property_idr": 80000000000,
      "movable_property_idr": 20000000000,
      "securities_idr": 30000000000,
      "cash_idr": 15000000000,
      "other_assets_idr": 5000000000
    },
    "income_from_position_idr": 2400000000,
    "other_income_idr": 500000000
  },
  "found": true,
  "status": "ACTIVE",
  "confidence": 1.0,
  "source_url": "https://elhkpn.kpk.go.id/portal/user/check_a_lhkpn",
  "fetched_at": "2026-03-13T10:00:00Z",
  "last_updated": null,
  "module": "lhkpn",
  "raw": {
    "report_id": "LHKPN-001234"
  }
}

Known Issues & Quirks

  • PDF extraction requires pip install 'indonesia-civic-stack[pdf]' (pdfplumber + anthropic)
  • Text-layer PDFs are processed with pdfplumber (fast); scanned/image PDFs fall back to Claude Vision API (slow, requires ANTHROPIC_API_KEY)
  • Some older declarations have incomplete data or missing asset breakdowns
  • Net assets are computed as total_assets - total_liabilities if not explicitly provided
  • The portal occasionally returns duplicate entries for the same official with different report IDs
  • Confidence scoring: exact name match = 1.0, partial match = 0.9, word overlap = 0.5-0.9

VCR Fixtures

CassetteScenario
TBDActive declaration found
TBDOfficial not found
TBDSearch results with 5 officials
TBDCompare declarations across 2 years

This module queries KPK’s public LHKPN portal, which publishes wealth declarations for transparency and anti-corruption monitoring purposes as mandated by Indonesian law (UU No. 28/1999). No authentication is required for public search. Data is fetched on demand and not persisted. All data is voluntarily disclosed by public officials as required by law.