# PhilGEPS Government Tender & Bid Notices Scraper (`bareezh_codes/philgeps-tender-notices-scraper`) Actor

Extract open bid opportunities and award notices from PhilGEPS, the Philippine government's official procurement portal, with budget, agency, category, deadline and contact details ready for lead lists or monitoring.

- **URL**: https://apify.com/bareezh\_codes/philgeps-tender-notices-scraper.md
- **Developed by:** [Salman Bareesh](https://apify.com/bareezh_codes) (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 $3.50 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Get a live feed of open **Philippine government tender and bid opportunities** straight from [PhilGEPS](https://notices.philgeps.gov.ph) (the Philippine Government Electronic Procurement System), with budget, procuring agency, category, closing deadline and contact person — ready to drop into a lead list, CRM, or daily monitoring sheet, instead of checking the government portal by hand every morning.

### Why use the PhilGEPS Tender & Bid Notices Scraper?

The Philippines posted over 300,000 bid notices worth roughly PHP 715 billion (~USD 12.7B) in government contracts in 2025 alone — but the official [notices.philgeps.gov.ph](https://notices.philgeps.gov.ph) portal is a legacy government site with no email alerts, no API, and no export beyond its own clunky search UI. Small and mid-size Filipino suppliers, construction firms, IT vendors, and business-development teams currently browse it manually every day looking for open bids in their sector. This actor reads the same public search results PhilGEPS itself publishes and turns them into structured, filterable leads.

Main capabilities:

- Reads live open bid opportunities directly from PhilGEPS' own public search (no login required, no third-party data broker).
- Filters by keyword, classification (Goods / Civil Works / Consulting Services), area of delivery, and minimum approved budget.
- Fetches the full notice detail for every match: procuring entity, procurement mode, approved budget, closing deadline, and the contact person's name, email and phone.
- Runs on Apify, so you get scheduling (a daily morning feed of new tenders), API/webhook access, and dataset export out of the box.

Typical use cases:

- **B2B sales prospecting for government contractors** — construction, IT, medical-supply and consulting firms that bid on Philippine government work, watching for open tenders in their category before they close.
- **Lead-gen and business-development agencies** — build and resell curated lists of live Philippine government tender leads.
- **Competitive intelligence / market research** — track public procurement activity, spending by agency, and category trends over time.
- **Bid-monitoring automation** — replace a manual daily check of the PhilGEPS portal with a scheduled Apify run and an email/Slack alert on new matches.

### What data can the PhilGEPS Tender & Bid Notices Scraper extract?

| Field | Type | Description |
|---|---|---|
| `title`, `referenceNumber` | string | Notice title and PhilGEPS reference number |
| `procuringEntity` | string | The government office/agency running the procurement |
| `category`, `classification` | string | PhilGEPS business category (e.g. "Vehicles") and classification (Goods / Civil Works / Consulting Services) |
| `approvedBudgetForContractPhp` | number | Approved Budget for the Contract (ABC), in PHP |
| `publishDate`, `closingDate` | string | When the notice was published and when bidding closes (Philippine time, UTC+8) |
| `contactPerson`, `contactEmail`, `contactPhone` | string | The BAC (Bids and Awards Committee) contact listed on the notice |
| `detailUrl` | string | Link to the live notice on notices.philgeps.gov.ph |

See [Output](#output) below for the full field reference and a complete real example.

### How to use the PhilGEPS Tender & Bid Notices Scraper

1. Click **Try for free** (or **Run**) on this actor's page.
2. Optionally set `keyword` to search titles, or `category` / `areaOfDelivery` / `minApprovedBudgetPhp` to narrow results.
3. Optionally set `publishedFrom` / `publishedTo` (defaults to the last 7 days).
4. Set `maxItems` to cap how many leads you want back.
5. Click **Start** and wait for the run to finish.
6. Open the **Dataset** tab and export your leads as JSON, CSV, or Excel — or pull them programmatically via the **API** tab.

### How much will it cost to use the PhilGEPS Tender & Bid Notices Scraper?

You pay only for notices delivered — **$0.005 per result**.

| Your Apify discount tier | Price per result | 1,000 results |
|---|---|---|
| Free | $0.0050 | $5.00 |
| Bronze | $0.0045 | $4.50 |
| Silver | $0.0040 | $4.00 |
| Gold / Platinum / Diamond | $0.0035 | $3.50 |

Apify's free plan includes $5 of monthly credit — enough for about 1,000 leads at no cost. A typical daily pull of 50 fresh tenders costs about $0.25.

A run stops automatically once it has returned `maxItems` results, once it hits your run's maximum charge (Apify's pay-per-result cost cap), or once it walks past the requested publish-date window, whichever comes first.

### Input

All fields are optional — running the actor with an empty input (`{}`) returns open bid opportunities published in the last 7 days.

| Field | Type | Default | Description |
|---|---|---|---|
| `keyword` | string | `""` (all) | Free-text search across tender titles |
| `category` | string | `""` (all) | PhilGEPS classification to keep, e.g. `"Goods"`, `"Civil Works"`, `"Consulting Services"` (substring match) |
| `areaOfDelivery` | string | `""` (all) | Region/province filter, e.g. `"Cebu"` (substring match) |
| `minApprovedBudgetPhp` | integer | `0` | Only notices with an Approved Budget for the Contract at least this many PHP |
| `publishedFrom` | string (`YYYY-MM-DD`) | 7 days ago | Start of the publish-date range |
| `publishedTo` | string (`YYYY-MM-DD`) | today | End of the publish-date range (inclusive) |
| `maxItems` | integer | `100` | Maximum number of tender notices to return |

`publishedFrom` must not be later than `publishedTo` — the run fails immediately with an error message if it is.

Example input for "open civil works tenders worth at least PHP 5M in the last 2 weeks":

```json
{
  "category": "Civil Works",
  "minApprovedBudgetPhp": 5000000,
  "publishedFrom": "2026-09-01",
  "publishedTo": "2026-09-15",
  "maxItems": 200
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. One item is produced per bid notice, with the same keys every time (`null` when the notice doesn't include that data). This is a real item from a live run of this actor (`tests/smoke_input.json`, notices published on 2026-09-15):

```json
{
  "referenceNumber": "13058348",
  "title": "Purchase of Chariot at Brgy. 07 Poblacion, Quinapodan, Eastern Samar",
  "procuringEntity": "BARANGAY 07 POBLACION, QUINAPONDAN, EASTERN SAMAR",
  "category": "Vehicles",
  "classification": "Goods",
  "procurementMode": "Public Bidding",
  "approvedBudgetForContractPhp": 196000.0,
  "currency": "PHP",
  "areaOfDelivery": "Eastern Samar",
  "publishDate": "2026-09-15",
  "closingDate": "2026-09-22T09:00:00+08:00",
  "status": "open",
  "awardee": null,
  "awardAmountPhp": null,
  "contactPerson": "NOEL A PADUA",
  "contactEmail": "quinapondanbarangays@gmail.com",
  "contactPhone": "63-966-9686099",
  "detailUrl": "https://notices.philgeps.gov.ph/GEPSNONPILOT/Tender/SplashBidNoticeAbstractUI.aspx?menuIndex=3&refID=13058348&Result=3",
  "scrapedAt": "2026-09-15T01:07:09.705679+00:00"
}
```

#### Field reference

| Field | Description |
|---|---|
| `referenceNumber` | PhilGEPS reference number for this notice |
| `title` | Notice title |
| `procuringEntity` | Government office/agency running the procurement |
| `category` | PhilGEPS business category (e.g. "Vehicles", "Electrical Supplies") |
| `classification` | Goods / Civil Works / Consulting Services |
| `procurementMode` | e.g. "Public Bidding" |
| `approvedBudgetForContractPhp`, `currency` | Approved Budget for the Contract and its currency (always PHP) |
| `areaOfDelivery` | Region/province where goods or works are to be delivered |
| `publishDate`, `closingDate` | Publish date and bid-closing date/time (Philippine Standard Time, UTC+8) |
| `status` | `open` (active bidding) or the PhilGEPS status lower-cased (e.g. `closed`) |
| `awardee`, `awardAmountPhp` | Reserved for award data; always `null` — see Limits below |
| `contactPerson`, `contactEmail`, `contactPhone` | The BAC contact listed on the notice |
| `detailUrl` | Link to the live notice on notices.philgeps.gov.ph |
| `scrapedAt` | UTC timestamp when this actor read the notice |

### FAQ, disclaimers, and support

**Is this legal?** Yes. PhilGEPS is the Philippine government's official public procurement portal — bid notices are published specifically so suppliers can find and respond to them, with no login required to view them. This actor only reads that public data through the same public pages a browser would.

**How fresh is the data?** As fresh as PhilGEPS itself — notices appear in the actor's results as soon as they're published on the portal. Run this actor daily with a rolling `publishedFrom`/`publishedTo` to build an ongoing lead feed.

**Why are `awardee` and `awardAmountPhp` always null?** This actor reads PhilGEPS' "Open Opportunities" listing, which covers active bids, not the separate award-notice archive. These fields are reserved in the output shape for a future version that also covers award notices.

**Why did my run return fewer than `maxItems` results?** Your filters (keyword, category, area, minimum budget, or a narrow date range) may simply match fewer notices than requested. Widen the date range or relax a filter to get more.

**Why did my run fail immediately?** `publishedFrom` cannot be later than `publishedTo` — the actor rejects that combination up front with an error message instead of running.

#### Legal & compliance note

All data comes from [notices.philgeps.gov.ph](https://notices.philgeps.gov.ph), the Philippine government's official procurement portal, which the Government Procurement Policy Board explicitly publishes for public and bidder access. This actor does not access any non-public or login-walled data. Contact details returned by this actor (`contactPerson`, `contactEmail`, `contactPhone`) are the agency's official Bids and Awards Committee (BAC) business contact, published by the government specifically so bidders can reach them — not private individual data.

#### Limits & notes

- Covers **open bid opportunities** only (PhilGEPS' "Open Opportunities" search); the separate recent-award archive is not included, so `awardee`/`awardAmountPhp` are always `null`.
- `category` and `areaOfDelivery` are matched as case-insensitive substrings against the notice's classification and area-of-delivery fields, since PhilGEPS' public search does not expose a structured filter for either.
- PhilGEPS is a legacy ASP.NET site; a markup change on their end could occasionally require a selector update.

#### Support

Found a bug or have a feature request? Use the **Issues** tab on this actor's page. For programmatic access, see the **API** tab for ready-made code snippets in your language of choice.

# Actor input Schema

## `keyword` (type: `string`):

Free-text search across tender titles (matches PhilGEPS' own keyword search). Leave empty to include all open opportunities.

## `category` (type: `string`):

PhilGEPS classification to keep, e.g. "Goods", "Civil Works", "Consulting Services". Matched case-insensitively as a substring. Leave empty to include all classifications.

## `areaOfDelivery` (type: `string`):

Region/province filter, e.g. "Cebu" or "Metro Manila". Matched case-insensitively as a substring of the notice's area of delivery. Leave empty to include all areas.

## `minApprovedBudgetPhp` (type: `integer`):

Only include notices whose Approved Budget for the Contract is at least this many Philippine pesos.

## `publishedFrom` (type: `string`):

Start of the publish-date range (YYYY-MM-DD). Defaults to 7 days before today.

## `publishedTo` (type: `string`):

End of the publish-date range (YYYY-MM-DD), inclusive. Defaults to today.

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

Maximum number of tender notices to return.

## Actor input object example

```json
{
  "keyword": "",
  "category": "",
  "areaOfDelivery": "",
  "minApprovedBudgetPhp": 0,
  "maxItems": 100
}
```

# Actor output Schema

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

One item per matching bid notice

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("bareezh_codes/philgeps-tender-notices-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("bareezh_codes/philgeps-tender-notices-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 '{}' |
apify call bareezh_codes/philgeps-tender-notices-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bareezh_codes/philgeps-tender-notices-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/4ROJ86IJxlHaCejMU/builds/Yrhsh7Jqswjs0aoH2/openapi.json
