# LPSE Indonesia Government Tenders Scraper (`den_den/lpse-tenders-scraper`) Actor

Scrape Indonesian government tenders from SPSE/LPSE (spse.inaproc.id): package name, agency, stage, HPS budget, method, category and year, with optional exact ceiling and HPS, work unit, location, qualification and bidder count. Monitor mode returns only new or changed tenders.

- **URL**: https://apify.com/den_den/lpse-tenders-scraper.md
- **Developed by:** [Mr Putra](https://apify.com/den_den) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 tender saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## LPSE Indonesia Government Tenders Scraper

Get Indonesian government procurement packages from SPSE / LPSE ([spse.inaproc.id](https://spse.inaproc.id)) as clean JSON, CSV or Excel: package name, agency, current stage, estimated budget (HPS), procurement method, category and fiscal year. Turn on details for the exact ceiling and HPS in rupiah, work unit, work location, contract type, required business size, qualification requirements, RUP codes and bidder count. Monitor mode returns only new or changed packages, so it works as a daily tender alert feed.

Covers the national instance (central and many regional agencies) by default, any of about 600 LPSE instances by slug, or all of them.

### What you can do with it

- **Contractors and suppliers:** find new tenders in your category, province and budget range every morning.
- **Tender consultants and business developers:** track agencies you work with and see who is bidding.
- **Analysts and journalists:** budget sizes, methods and stages by agency, category and year.

### Input

| Field | What it does |
| --- | --- |
| LPSE instances | Slugs from `spse.inaproc.id/<slug>`, e.g. `nasional`, `kemenkeu`, `pu`, `jakarta`, `jabarprov`. Default `nasional`. |
| All 600 LPSE instances | Scan every known instance (slow; combine with filters). |
| Package types | Tender and/or non-tender (direct procurement). |
| Budget year | Fiscal year (TA). Default: current year. |
| Categories | Goods, construction, consulting, other services… |
| Keywords / Agency contains | Keep packages whose name or agency contains a word. |
| Min / Max HPS | Budget range in rupiah. |
| Skip finished or cancelled | Drop packages already finished, cancelled or failed. |
| Include announcement details | Exact ceiling and HPS, work unit, location, qualification, bidders. |
| Monitor mode + Monitor key | Save only packages that are new or changed since the last run with the same key. |
| Max pages per instance / Max packages per instance and type | Limits (100 packages per page, newest first); each instance and package type gets its own quota. |

Example: construction tenders above Rp 1 billion in West Java with details

```json
{
  "instances": ["jabarprov", "nasional"],
  "categories": ["Pekerjaan Konstruksi"],
  "agencies": ["Jawa Barat"],
  "minHpsIdr": 1000000000,
  "excludeFinished": true,
  "includeDetails": true,
  "maxItems": 100
}
```

### Output

```json
{
  "code": "10170000000",
  "packageType": "tender",
  "name": "Pengadaan Contoh Peralatan Kantor",
  "agency": "Pemerintah Provinsi Contoh",
  "stage": "Pengumuman Pascakualifikasi",
  "hpsText": "907,8 Jt",
  "hpsIdrApprox": 907800000,
  "method": "Tender",
  "qualificationMethod": "Pascakualifikasi Satu File",
  "evaluationMethod": "Harga Terendah Sistem Gugur",
  "category": "Pengadaan Barang",
  "budgetYear": 2026,
  "lpseInstance": "nasional",
  "url": "https://spse.inaproc.id/nasional/lelang/10170000000/pengumumanlelang",
  "workUnit": "... (with details)",
  "ceilingIdr": 907829484,
  "hpsIdr": 907829484,
  "location": "... (with details)",
  "businessQualification": "Non Kecil",
  "participants": 15
}
```

In monitor mode each row also has `change` (`new` or `changed`), `changedFields` and `previousValues`.

### Daily tender alerts

1. Set your filters, turn on **Monitor mode** and give it a **Monitor key**, e.g. `jabar-konstruksi`.
2. Schedule the Actor daily in Apify (Schedules).
3. Each run saves only new packages, or packages whose stage, name or HPS changed. Unchanged packages are not saved and not charged.
4. Send results to email, Slack, Google Sheets or a webhook with Apify integrations.

### Pricing

Pay per package saved; announcement details are an extra charge per package. Unchanged packages in monitor mode are free. See the Pricing tab.

### Notes

- SPSE only answers Indonesian IP addresses, so the Actor uses Apify's Indonesian residential proxy (included in the price).
- The list shows HPS rounded (e.g. "907,8 Jt"); turn on details for the exact amount.
- Only public announcement pages are read: no login, no bidder documents.
- Not affiliated with LKPP or any LPSE. Procurement announcements are public information; use the data responsibly and in line with Indonesian law.

***

### Bahasa Indonesia

Ambil data paket pengadaan pemerintah dari SPSE/LPSE (spse.inaproc.id): nama paket, instansi, tahap, HPS, metode, kategori dan tahun anggaran. Aktifkan **Include announcement details** untuk nilai pagu dan HPS persis, satuan kerja, lokasi pekerjaan, kualifikasi usaha, syarat kualifikasi, kode RUP dan jumlah peserta. **Monitor mode** hanya menyimpan paket baru atau yang berubah sejak run terakhir, cocok untuk notifikasi tender harian lewat jadwal Apify.

Cocok untuk kontraktor, penyedia barang/jasa, konsultan tender dan analis. Hanya membaca halaman pengumuman publik, tanpa login.

# Actor input Schema

## `instances` (type: `array`):

SPSE instance slugs from spse.inaproc.id/<slug>, e.g. nasional (central and many regional agencies), kemenkeu, pu, jakarta, jabarprov. Default: nasional.

## `allInstances` (type: `boolean`):

Scan every known LPSE instance (about 600). Slow; use with filters and Max packages.

## `packageTypes` (type: `array`):

Tender (lelang/seleksi) and/or non-tender (pengadaan langsung, penunjukan langsung).

## `year` (type: `integer`):

Fiscal year of the packages. Default: current year.

## `categories` (type: `array`):

Only these procurement categories. Leave empty for all.

## `keywords` (type: `array`):

Keep packages whose name contains any of these words, e.g. "jalan", "laptop", "CCTV".

## `agencies` (type: `array`):

Keep packages whose agency name contains any of these words, e.g. "Provinsi Jawa Barat", "Kementerian Kesehatan".

## `minHpsIdr` (type: `integer`):

Only packages with an estimated budget (HPS) of at least this many rupiah.

## `maxHpsIdr` (type: `integer`):

Only packages with an estimated budget (HPS) of at most this many rupiah.

## `excludeFinished` (type: `boolean`):

Drop packages whose stage says finished, cancelled or failed.

## `includeDetails` (type: `boolean`):

Open each announcement page for exact ceiling and HPS, work unit, location, contract type, business qualification, requirements, RUP codes and bidder count. Charged as an extra event per package.

## `monitorMode` (type: `boolean`):

Save only packages that are new, or whose name, stage or HPS changed, since the last run with the same monitor key. Unchanged packages are not saved or charged.

## `monitorKey` (type: `string`):

Name for this monitor's memory. Use a different key per search you schedule.

## `maxPagesPerInstance` (type: `integer`):

Pages of 100 packages to read per instance, package type and category (newest first).

## `maxItems` (type: `integer`):

Stop after this many packages for each LPSE instance and package type (newest first).

## Actor input object example

```json
{
  "instances": [
    "nasional"
  ],
  "allInstances": false,
  "packageTypes": [
    "tender"
  ],
  "excludeFinished": false,
  "includeDetails": false,
  "monitorMode": false,
  "monitorKey": "default",
  "maxPagesPerInstance": 20,
  "maxItems": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with one row per procurement package

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "instances": [
        "nasional"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("den_den/lpse-tenders-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "instances": ["nasional"] }

# Run the Actor and wait for it to finish
run = client.actor("den_den/lpse-tenders-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "instances": [
    "nasional"
  ]
}' |
apify call den_den/lpse-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,den_den/lpse-tenders-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bjbwpQEUIOiQMtIfR/builds/0RXJYoTuMbWbLhkuJ/openapi.json
