Python API Reference

This section documents the low-level classes and object definitions exported by the pyproc package. The primary class is Lpse, which acts as the HTTP client wrapper for public SPSE portals.

class Lpse(instansi: str, timeout: int = 10, verify: bool = False, user_agent: str = None)
Source Code →

Creates an LPSE client instance targeting a specific government SPSE instance endpoint.

Parameter Type Description
instansi str Slug name of the LPSE host. E.g. "kemenkeu", "jakarta", "pu", or "nasional".
timeout int HTTP request timeout in seconds (default: 10).
verify bool Whether to verify SSL/TLS certificates (default: False). Recommended to leave False.
user_agent str Custom HTTP User-Agent string. If None, defaults to a standard browser headers template.
get_paket_tender(start: int = 0, length: int = 0, data_only: bool = False, kategori: JenisPengadaan = None, search_keyword: str = None, order: By = By.KODE, tahun: int = None, ascending: bool = False, instansi_id: str = None, kontrak_status: KontrakStatus = None) → dict | list
Source Code →

Retrieves tender (lelang) package listings from the LPSE database.

Parameter Type Description
start int Start record index (offset) for server-side pagination.
length int Page size limit (e.g. 10, 50, 100). Use 0 for server maximum.
data_only bool If True, returns a clean Python list containing rows. If False, returns the raw SPSE DataTables dictionary with keys "draw", "recordsTotal", and "data".
kategori JenisPengadaan Enum filter for the procurement type.
search_keyword str String filter matches inside title or codes.
order By Sorting column option (default: By.KODE).
tahun int Budget year limit (e.g. 2025).
ascending bool Sort order logic. Set True for ASC, False (default) for DESC.
get_paket_non_tender(start: int = 0, length: int = 0, data_only: bool = False, kategori: JenisPengadaan = None, search_keyword: str = None, order: By = By.KODE, tahun: int = None, ascending: bool = False, instansi_id: str = None) → dict | list
Source Code →

Retrieves non-tender listings (Direct Selection, Direct Purchasing, or Direct Appointment) from the SPSE database.

Parameter Type Description
start int Start record index (offset) for server-side pagination.
length int Page size limit (use 0 for maximum).
data_only bool If True, returns a clean Python list containing rows. If False, returns the raw SPSE DataTables dictionary structure.
kategori JenisPengadaan Enum filter for the procurement type.
search_keyword str String filter matches inside title or codes.
order By Sorting column option (default: By.KODE).
tahun int Budget year limit (e.g. 2025).
ascending bool Sort order logic (default: False).
get_paket_pencatatan_non_tender(start: int = 0, length: int = 0, data_only: bool = False, kategori: JenisPengadaan = None, search_keyword: str = None, order: By = By.KODE, tahun: int = None, ascending: bool = False, instansi_id: str = None) → dict | list
Source Code →

Retrieves logged pencatatan non-tender items (distinct dataset under SPSE /dt/nonspk). Parameters match get_paket_non_tender.

get_paket_swakelola(start: int = 0, length: int = 0, data_only: bool = False, search_keyword: str = None, rekanan: str = None, order: By = By.KODE, tahun: int = None, ascending: bool = False, tipe_swakelola: TipeSwakelola = None) → dict | list
Source Code →

Retrieves logged swakelola items.

Parameter Type Description
rekanan str Filter swakelola items by executing partner/contractor name query.
tipe_swakelola TipeSwakelola Enum filter specifying swakelola type (TIPE_I to TIPE_IV).
get_paket_pengadaan_darurat(start: int = 0, length: int = 0, data_only: bool = False, kategori: JenisPengadaan = None, search_keyword: str = None, order: By = By.KODE, tahun: int = None, ascending: bool = False) → dict | list
Source Code →

Retrieves logged emergency procurement items. Parameters match get_paket_non_tender.

get_auth_token(from_cookies: bool = True) → str | None
Source Code →

Extracts CSRF/Auth token values from session headers or cookies to make authenticated requests.

get_master_klpd(timeout: int = 30) → list[dict]
Source Code →

Static Method: Queries LKPP master agency directory. Returns list of dictionaries detailing K/L/PD codes and names.

get_master_lpse(timeout: int = 30) → list[dict]
Source Code →

Static Method: Queries LKPP master LPSE server directory. Returns codes, domain addresses, and slugs of all active LPSE units in Indonesia.

get_tender_umum_publik(timeout: int = 30, tahun: int = None, kode_lpse: int = None) → list[dict]
Source Code →

Static Method: Performs direct public API queries using the LKPP Satu Data ISB service (acts as fallback when target host is down).

Parameter Type Description
tahun int Fiscal year filter.
kode_lpse int Numerical identifier of the target LPSE server in the master list.
detil_paket_tender(id_paket: str | int) → LpseDetil
Source Code →

Initializes and returns an LpseDetil parser object containing methods to parse nested pages of a specific tender.

detil_paket_non_tender(id_paket: str | int) → LpseDetilNonTender
Source Code →

Initializes and returns an LpseDetilNonTender parser object containing methods to parse nested pages of a specific non-tender.

detil_paket_pencatatan_non_tender(id_paket: str | int) → LpseDetilPencatatanNonTender
Source Code →

Initializes and returns an LpseDetilPencatatanNonTender parser object containing methods to parse logged non-tender transaction entries.

detil_paket_swakelola(id_paket: str | int) → LpseDetilSwakelola
Source Code →

Initializes and returns an LpseDetilSwakelola parser object containing methods to parse swakelola detail entries.

detil_paket_pengadaan_darurat(id_paket: str | int) → LpseDetilPengadaanDarurat
Source Code →

Initializes and returns an LpseDetilPengadaanDarurat parser object containing methods to parse emergency procurement details.

Enum: JenisPengadaan

An Enum representing general procurement categories in the SPSE portal system.

enum JenisPengadaan(Enum)
Source Code →
Enum Attribute Value Description
JenisPengadaan.PENGADAAN_BARANG "1" Goods/Equipment Procurement (Pengadaan Barang)
JenisPengadaan.PEKERJAAN_KONSTRUKSI "2" Civil/Construction Works (Pekerjaan Konstruksi)
JenisPengadaan.JASA_KONSULTASI "3" Consulting Services (Jasa Konsultansi)
JenisPengadaan.JASA_LAINNYA "4" Other Auxiliary Services (Jasa Lainnya)

Enum: By

An Enum representing sorting parameters targeting SPSE query columns.

enum By(Enum)
Source Code →
Enum Attribute Value Target Column
By.KODE 0 Tender ID / Code
By.NAMA 1 Tender Title / Name
By.KATEGORI 2 Procurement Category
By.INSTANSI 3 Government Institution
By.HPS 4 HPS (Self-estimated contract price)

Enum: KontrakStatus

An Enum representing procurement contract states.

enum KontrakStatus(Enum)
Source Code →
Enum Attribute Value Meaning
KontrakStatus.SELESAI 0 Tender complete / executed successfully.
KontrakStatus.PEMUTUSAN 1 Contract terminated (Pemutusan Kontrak).
KontrakStatus.PENGHENTIAN 2 Contract suspended (Penghentian Kontrak).

Enum: TipeSwakelola

An Enum representing swakelola execution categories (Tipe Swakelola).

enum TipeSwakelola(Enum)
Source Code →
Enum Attribute Value Description
TipeSwakelola.TIPE_I "1" Planned, executed, and supervised directly by the bidding state institution.
TipeSwakelola.TIPE_II "2" Planned and supervised by the bidding agency, executed by another state institution partner.
TipeSwakelola.TIPE_III "3" Planned and supervised by the bidding agency, executed by a community group organization (Ormas).
TipeSwakelola.TIPE_IV "4" Planned and supervised by the bidding agency, executed by a local community resident group (Kelompok Masyarakat).

Class: BaseLpseDetil

Acts as the base manager for executing sub-page scraping on a specific tender. Sub-pages are evaluated dynamically based on availability.

class BaseLpseDetil(id_paket: str | int, lpse: Lpse)
Source Code →

Instantiated by the parent client. Stores package ID metadata and connection hooks.

get_all_detil() → None
Source Code →

Fetches and runs parsing threads for all available section sub-pages (Announcement, Participants, Evaluations, Winners, Schedule) concurrently using client workers.

todict() → dict
Source Code →

Aggregates all parsed details into a nested Python dictionary containing keys like "pengumuman", "peserta", "pemenang", etc.

get_pengumuman() → dict
Source Code →

Scrapes specific fields inside the announcement page: budget values, location coordinates, requirements, qualifications, and LPSE code IDs.

get_peserta() → list
Source Code →

Returns the complete list of participating bidder companies registered for this tender package.

get_hasil_evaluasi() → list
Source Code →

Parses the detailed evaluation matrix page containing bid evaluation results (administrative, technical, and price evaluation details).

get_pemenang(all: bool = False, key: str = 'hasil_negosiasi') → list
Source Code →

Parses and lists the final winner(s) details, including NPWP identifier, name, address, bid price, and negotiated price values.

Parameter Type Description
all bool If True, yields detailed results for all candidates. If False, yields only the official primary winners.
key str Price key target used to sort/validate candidates (default: 'hasil_negosiasi').
get_pemenang_berkontrak() → list
Source Code →

Scrapes details of the contracted winner, yielding the final contract signing details and execution status.

get_jadwal() → list
Source Code →

Retrieves the complete schedule list with dates, step names, and status (past, active, future) for the entire procurement process.

Subclasses: Specialized Detail Managers

Different kinds of SPSE procurements structure detail grids slightly differently. PyProc resolves this transparency using sub-classes inheriting from BaseLpseDetil:

Class Name Instantiated By Source Reference
LpseDetil detil_paket_tender(id) lpse.py#L473 →
LpseDetilNonTender detil_paket_non_tender(id) lpse.py#L535 →
LpseDetilPencatatanNonTender detil_paket_pencatatan_non_tender(id) lpse.py#L592 →
LpseDetilSwakelola detil_paket_swakelola(id) lpse.py#L606 →
LpseDetilPengadaanDarurat detil_paket_pengadaan_darurat(id) lpse.py#L622 →
class LpseDetil(lpse: Lpse, id_paket: str | int)
Source Code →

Manager for standard tender procurement details. Instantiated via Lpse.detil_paket_tender(id).

Supported detail_methods:

  • get_pengumuman(): Scrapes tender announcement details.
  • get_peserta(): Scrapes participating bidder companies.
  • get_hasil_evaluasi(): Scrapes evaluation matrix page.
  • get_pemenang(all=False, key='hasil_negosiasi'): Scrapes winners list.
  • get_pemenang_berkontrak(): Scrapes contract-awarded winners list.
  • get_jadwal(): Scrapes schedule steps.
class LpseDetilNonTender(lpse: Lpse, id_paket: str | int)
Source Code →

Manager for standard non-tender (direct procurement/selection) details. Instantiated via Lpse.detil_paket_non_tender(id).

Supported detail_methods:

  • get_pengumuman(): Scrapes non-tender announcement details.
  • get_peserta(): Scrapes participating bidders.
  • get_hasil_evaluasi(): Scrapes non-tender evaluation details.
  • get_pemenang(): Scrapes winner list.
  • get_pemenang_berkontrak(): Scrapes contract-awarded winners.
  • get_jadwal(): Scrapes non-tender schedules.
class LpseDetilPencatatanNonTender(lpse: Lpse, id_paket: str | int)
Source Code →

Manager for recorded non-tender (pencatatan non-tender) procurement details. Instantiated via Lpse.detil_paket_pencatatan_non_tender(id).

Supported detail_methods:

  • get_pengumuman(): Scrapes recorded announcement details.
  • get_pemenang_berkontrak(): Scrapes contracted winners.
class LpseDetilSwakelola(lpse: Lpse, id_paket: str | int)
Source Code →

Manager for self-managed (swakelola) procurement details. Instantiated via Lpse.detil_paket_swakelola(id).

Supported detail_methods:

  • get_pengumuman(): Scrapes swakelola announcement details.
  • get_pelaksana(): Scrapes swakelola implementing officer/team (cached in self.pelaksana).
class LpseDetilPengadaanDarurat(lpse: Lpse, id_paket: str | int)
Source Code →

Manager for emergency procurement (pengadaan darurat) details. Instantiated via Lpse.detil_paket_pengadaan_darurat(id).

Supported detail_methods:

  • get_pengumuman(): Scrapes emergency announcement details.
  • get_pemenang_berkontrak(): Scrapes contracted emergency winners.

HTML Parsers: Low-Level Parser API

PyProc resolves raw HTML detail pages into structured data matrices using a set of purpose-built parsers derived from BaseLpseDetilParser.

class BaseLpseDetilParser(lpse: Lpse, id_paket: str | int)
Source Code →

Abstract base parser representing a page scraper context. Downloads page content and triggers subclass parsers.

get_detil() → any
Source Code →

Fetches the detail sub-page url (combining LPSE host address and formatted target paths) and passes raw bytes to parse_detil. Employs backoff fibonacci retry routines on server/network failures.

parse_detil(content: bytes) → abstract
Source Code →

Abstract parsing method overridden by specialized parsers to extract table rows, forms, and grid fields from raw HTML string bytes.

static parse_currency(nilai: str) → float
Source Code →

Helper static utility method. Sanitizes and normalizes Indonesian Rupiah (IDR) raw strings containing decimals and thousands separators (e.g. converting Rp. 150.000.000,00 to float 150000000.0).

Specialized Parser Implementations

PyProc registers 21 specialized parser subclasses mapped to the different SPSE procurement types. They parse target HTML layouts dynamically using BeautifulSoup, transforming tabular data keys (headers/labels) into unified snake_case dictionaries.

1. Standard Tender Parsers (Tender SPSE)

These parsers inherit directly from BaseLpseDetilParser and target the standard tender pages:

  • LpseDetilPengumumanParser (Path: /lelang/{id}/pengumumanlelang): Parses tender announcement tables. Extracts metadata like tender name, description, owner agency (K/L/PD), structural budgets (HPS, ceiling values), location data, and technical/qualification requirement criteria.
  • LpseDetilPesertaParser (Path: /lelang/{id}/pesertalelang): Parses the bidder company list containing bidder registered names, NPWP, bidding offers, and prices.
  • LpseDetilHasilEvaluasiParser (Path: /lelang/{id}/evaluasilelang): Parses the evaluation grid matrix. Resolves columns for administrative, technical, and price evaluation flags per bidder.
  • LpseDetilPemenangParser (Path: /lelang/{id}/pemenanglelang): Parses the final winner table details. Resolves candidates, final bid prices, and negotiated prices.
  • LpseDetilPemenangBerkontrakParser (Path: /lelang/{id}/pemenangberkontrak): Inherits from LpseDetilPemenangParser. Extracts contract signing status and values for awarded candidates.
  • LpseDetilJadwalParser (Path: /lelang/{id}/jadwal): Parses chronological schedule steps, dates, and active step markers.

2. Non-Tender / Direct Selection Parsers

These parsers mirror standard tender parsers but target direct selection endpoints (/penunjukan or /pengadaangrow grids). They inherit from their tender parser equivalents to reuse BeautifulSoup parsers:

  • LpseDetilPengumumanNonTenderParser (Announcement parser inheriting from LpseDetilPengumumanParser)
  • LpseDetilPesertaNonTenderParser (Bidders parser inheriting from LpseDetilPesertaParser)
  • LpseDetilHasilEvaluasiNonTenderParser (Evaluation parser inheriting from LpseDetilHasilEvaluasiParser)
  • LpseDetilPemenangNonTenderParser (Winner parser inheriting from LpseDetilPemenangParser)
  • LpseDetilPemenangBerkontrakNonTenderParser (Contract parser inheriting from LpseDetilPemenangNonTenderParser)
  • LpseDetilJadwalNonTenderParser (Schedule parser inheriting from LpseDetilJadwalParser)

3. Recorded (Pencatatan) Parsers

Used to parse recorded transactions. They inherit from BaseLpseDetilParser and include PencatatanTableParserMixin to handle different layout styles:

  • LpseDetilPengumumanPencatatanParser: Parses general details of recorded transactions (non-tender catalog orders).
  • LpseDetilRealisasiPencatatanParser: Parses real-time procurement execution and payout details.
  • LpseDetilPemenangBerkontrakPencatatanParser: Inherits from LpseDetilRealisasiPencatatanParser. Parses contractor profiles and registration details.
  • LpseDetilPengumumanPencatatanNonTenderParser: Inherits from LpseDetilPengumumanPencatatanParser. Handles recorded non-tender announcements.
  • LpseDetilPemenangBerkontrakPencatatanNonTenderParser: Inherits from LpseDetilPemenangBerkontrakPencatatanParser. Handles recorded non-tender contracts.

4. Swakelola and Emergency Parsers

Parsers specialized for self-managed (Swakelola) and emergency (Pengadaan Darurat) government transactions:

  • LpseDetilPengumumanSwakelolaParser (Swakelola Announcement): Inherits from LpseDetilPengumumanPencatatanParser. Parses targets, objectives, and self-managed group scopes.
  • LpseDetilPelaksanaSwakelolaParser (Swakelola Execution): Inherits from LpseDetilRealisasiPencatatanParser. Parses implementing team members and officers.
  • LpseDetilPengumumanPengadaanDaruratParser (Emergency Announcement): Inherits from LpseDetilPengumumanPencatatanParser. Parses disaster relief and emergency response criteria details.
  • LpseDetilPemenangBerkontrakPengadaanDaruratParser (Emergency Winners): Inherits from LpseDetilPemenangBerkontrakPencatatanParser. Parses emergency contract structures.