# PhilGEPS Scraper - Philippines Government Bids (`tonzzz-ccc/philgeps-open-opportunities-scraper`) Actor

Extract open Philippine government procurement opportunities from PhilGEPS. Filter by category and region (all 17 regions) and get the agency, approved budget, area of delivery, closing date, contact details and line items as clean JSON, CSV or Excel.

- **URL**: https://apify.com/tonzzz-ccc/philgeps-open-opportunities-scraper.md
- **Developed by:** [Triston Molina](https://apify.com/tonzzz-ccc) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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

## PhilGEPS Open Opportunities Scraper

Extract open government procurement opportunities (bid notices) published on **PhilGEPS**, the Philippine Government Electronic Procurement System, without logging in.

### What it does

- Reads the public **Open Opportunities** listing on `notices.philgeps.gov.ph`
- Walks the category list (Catering Services, Medical Equipment, Construction, and more)
- Collects every row from the result pages and returns it as clean JSON, CSV, or Excel

### Who it's for

- Suppliers and contractors tracking new government bids
- Market researchers studying Philippine public spending
- Journalists and watchdog groups
- Sales teams that sell to government agencies

### Input

| Field | Description |
| --- | --- |
| `categories` | Category names to scrape (partial, case-insensitive). Empty = all categories. |
| `keywords` | Keep only rows that contain at least one keyword. Empty = keep all. |
| `regions` | Only keep opportunities in the selected Philippine regions (all 17 are available). Empty = whole country. |
| `locations` | Extra provinces, cities or municipalities to match, such as `Legazpi` or `Cebu City`. |
| `scrapeDetails` | Open each notice for budget, agency, area of delivery, contacts and line items. Required for location filtering. |
| `maxItems` | Maximum opportunities to save. `0` = no limit. |
| `maxPagesPerCategory` | Result pages to read per category. |
| `proxyConfiguration` | Optional proxy settings. |

#### Example input

```json
{
    "categories": ["Catering Services"],
    "regions": ["region5"],
    "locations": ["Masbate"],
    "maxItems": 200,
    "maxPagesPerCategory": 20
}
```

This returns catering opportunities delivered to the Bicol Region (Albay, Camarines Norte, Camarines Sur, Catanduanes, Masbate, Sorsogon and their cities).

### Output

Each dataset item looks like this:

```json
{
    "category": "Catering Services",
    "matchedRegion": "Region XII - SOCCSKSARGEN",
    "matchedLocation": "Sarangani",
    "referenceNumber": "13303648",
    "title": "SUPPLY AND DELIVERY OF PACKED MEALS AND SNACKS FOR PGO-PYDD",
    "procuringEntity": "PROVINCE OF SARANGANI",
    "approvedBudget": 280000,
    "approvedBudgetText": "PHP 280,000.00",
    "publishDate": "24/10/2026",
    "closingDate": "27/10/2026 09:00 AM",
    "areaOfDelivery": "Sarangani",
    "procurementMode": "Negotiated Procurement - Small Value Procurement (Sec. 34)",
    "classification": "Goods",
    "noticeType": "Request for Quotation (RFQ)",
    "solicitationNumber": "RFQ 2026-9-1366",
    "deliveryPeriod": "15 Day/s",
    "status": "Active",
    "contactName": "Delmor De Vera Pascual",
    "contactEmail": "bacsecsarangani@gmail.com",
    "contactPhone": "63-83-5083008",
    "lineItems": [{ "no": 1, "quantity": 1400, "unit": "PAX", "itemDescription": "SNACK (AM/PM) ..." }],
    "documents": [],
    "detailUrl": "https://notices.philgeps.gov.ph/GEPSNONPILOT/Tender/SplashBidNoticeAbstractUI.aspx?...",
    "scrapedAt": "2026-10-24T03:18:07.754Z"
}
```

### Notes

- The site is built on ASP.NET postbacks, so the Actor uses a real browser (Playwright). Runs are slower than plain HTTP scrapers.
- Only public pages are read. No login, no personal data.
- Please keep run sizes reasonable to avoid putting load on a government server.
- Region and location filters are text matches on the notice's Area of Delivery and procuring entity. A few place names are shared by several areas (for example Naga or San Juan), so spot-check the results.
- Because the Actor must open each notice to check its location, runs with a region filter take longer than runs without one.
- If a run returns no rows, open the `DEBUG_FIRST_RESULTS_PAGE` and `DEBUG_FIRST_RESULTS_SCREENSHOT` records in the run's Key-value store and share them with the Actor's author.

### Support

Found a problem or need another Philippine government data source? Open an issue on the Actor page.

# Actor input Schema

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

Category names to scrape (case-insensitive, partial match). Leave empty to scrape all categories. Example: Catering Services, Medical Equipment.

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

Only keep opportunities whose row text contains at least one of these keywords (case-insensitive). Leave empty to keep everything.

## `regions` (type: `array`):

Only keep opportunities delivered to or issued in these Philippine regions. Matched against the Area of Delivery and the procuring entity. Leave empty for the whole country. Requires 'Scrape detail pages'.

## `locations` (type: `array`):

Extra provinces, cities or municipalities to match (whole-word, case-insensitive), for example Legazpi, Daraga, Cebu City. Combined with the selected regions.

## `scrapeDetails` (type: `boolean`):

Open each notice to get the procuring entity, approved budget, area of delivery, contact details and line items. Needed for the region and location filters. Slower, but much richer data.

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

Maximum number of opportunities to save in total. 0 means no limit.

## `maxPagesPerCategory` (type: `integer`):

Limit how many result pages are read for each category (about 20 rows per page). Raise this when using a region filter, because many rows are skipped.

## `proxyConfiguration` (type: `object`):

Optional. A Philippine or residential proxy can help if the site blocks datacenter IPs.

## Actor input object example

```json
{
  "categories": [
    "Catering Services"
  ],
  "scrapeDetails": true,
  "maxItems": 100,
  "maxPagesPerCategory": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields: category, reference number, title, agency, budget, dates, area of delivery and contact email.

## `results` (type: `string`):

Every field for every opportunity, including line items and contact details.

# 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 = {
    "categories": [
        "Catering Services"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tonzzz-ccc/philgeps-open-opportunities-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 = {
    "categories": ["Catering Services"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("tonzzz-ccc/philgeps-open-opportunities-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 '{
  "categories": [
    "Catering Services"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call tonzzz-ccc/philgeps-open-opportunities-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tonzzz-ccc/philgeps-open-opportunities-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/qkjrVoGz6n4CfsNVp/builds/EJHoEw5LYvFHsSC6i/openapi.json
