# Hong Kong Government Tenders Scraper (GLD, ArchSD, HKMA) (`brazen_outcome_iye/hk-gov-tenders`) Actor

Get Hong Kong government tender notices in English and Chinese from official DATA.GOV.HK open data: GLD e-Tender Box, Architectural Services Department and HKMA. Filter by keyword, department and date, and get only new or changed tenders since your last run. No personal contact data.

- **URL**: https://apify.com/brazen_outcome_iye/hk-gov-tenders.md
- **Developed by:** [Nagi](https://apify.com/brazen_outcome_iye) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 tender records

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

## Hong Kong Government Tenders Scraper (GLD e-Tender Box, ArchSD, HKMA)

**Get every open Hong Kong government tender in English and Chinese, and get alerts when new tenders are posted or existing ones change.**

This Actor pulls tender notices from official **DATA.GOV.HK** open-data feeds and returns clean JSON, CSV or Excel. Schedule it daily and you only receive the tenders that are new or changed since the last run, already filtered by your keywords and departments. You no longer need to check e-Tender Box by hand.

### Who is it for?

- **Suppliers and contractors** who bid for Hong Kong government work: IT, cleaning, security, medical supplies, building works, consultancy.
- **Bid managers and sales teams** who want closing dates and tender links in a CRM, Google Sheet or Slack channel.
- **Tender aggregators, newsletters and market-intelligence teams** that cover APAC public procurement.
- **AI agents and automations** that need a reliable "open HK government tenders about X" tool.

### Key features

- ✅ **3 official sources in one dataset:** GLD e-Tender Box (many bureaux and departments), Architectural Services Department works tenders, and HKMA tender notices.
- 🌏 **Bilingual:** subject, department, quantity, application and delivery fields in English **and** Traditional Chinese where the source provides both.
- 🔔 **Only-new/changed mode:** `changeType` = `new` / `changed` / `unchanged`, plus `changedFields` (for example, a revised closing date or a new addendum). Run state is saved in a named key-value store.
- 🔎 **Filters:** keywords (EN/中文), departments, closing or issue date range (absolute, or relative like `7 days`), open tenders only.
- 🛡️ **No personal data:** phone, fax, e-mail and named contact persons are removed.
- 🕒 ISO dates in Hong Kong time (`+08:00`), normalised status, and source attribution on every record.

### How to use it

1. Click **Try for free**, choose sources and keywords, then click **Start**.
2. Download results as JSON, CSV, Excel or HTML, or read them through the Apify API.
3. For alerts, save the input as a **Task** with `mode = newOrChanged`, add a daily **Schedule**, and connect an integration (email, Slack, Google Sheets, Make, Zapier, webhook).

#### Input example

```json
{
  "sources": ["GLD_ETB", "ARCHSD", "HKMA"],
  "keywords": ["IT", "software", "系統"],
  "departments": [],
  "mode": "newOrChanged",
  "onlyOpen": true,
  "stateStoreName": "my-it-tender-alerts"
}
```

### Output sample

Real records from a test run in October 2026:

| Source | Tender ref | Subject | Department | Closing date |
|---|---|---|---|---|
| GLD_ETB | FSD/PT/240 | Supply of Glucagon Hydrochloride Kit to the Fire Services Department | Fire Services Department | 2026-11-23 |
| GLD_ETB | DPO8566/4/31 | Supply of Anti-malware Software and Provision of Related Services | Digital Policy Office | 2026-11-23 |
| GLD_ETB | AFCD/LFSABD/02/27 | Provision of Cleansing Services to Recreation Areas in Lung Fu Shan… | Agriculture, Fisheries and Conservation Dept. | 2026-11-24 |
| GLD_ETB | SMT02 (26-27) | Supply of Scanning Electron Microscope and Associated Equipment | Hong Kong Police Force | 2026-12-01 |
| HKMA | G.N. 6275 of 2026 | Provision of a Next-Generation Supervisory CRM Platform… | Hong Kong Monetary Authority | – |
| ARCHSD | RF P806 | Refurbishment of Plumbing System Connecting to Buildings… | Architectural Services Department | 2026-10-16 |

One full record (shortened):

```json
{
  "changeType": "new",
  "source": "GLD_ETB",
  "tenderRef": "FSD/PT/240",
  "subjectEn": "Supply of Glucagon Hydrochloride Kit to the Fire Services Department",
  "subjectZh": "為消防處供應胰高血糖素鹽酸鹽套裝",
  "issuingDepartmentEn": "Fire Services Department",
  "issuingDepartmentZh": "消防處",
  "issueDate": "2026-10-09T00:00:00+08:00",
  "closingDateTime": "2026-11-23T12:00:00+08:00",
  "isOpen": true,
  "status": "Issued",
  "url": "https://pcms2.gld.gov.hk/iprod/#/STA00303?tenderReferenceNumber=FSD/PT/240",
  "attribution": "Source: Government Logistics Department, the Government of the HKSAR, via DATA.GOV.HK ..."
}
```

Other fields: `requisitioningDepartmentEn/Zh`, `quantityEn/Zh`, `applicationEn/Zh`, `deliveryScheduleEn/Zh`, `remarksEn/Zh`, `downloadOnly`, `closingDateRevised`, `newTenderFlag`, `newAddendumFlag`, `changedFields`, `firstSeenAt`, `scrapedAt`, `sourceDatasetUrl`.

### Pricing

Pay per event: you pay only for results.

- **$0.005 per tender record** returned, which is **$5 per 1,000 tenders**.
- **Actor start:** $0.00005 per run (per GB of memory), which is negligible.

| Typical run | Records | Approx. cost |
|---|---|---|
| Daily alert with 5 new/changed tenders | 5 | ~$0.025 |
| Snapshot of all currently open tenders (~60) | ~60 | ~$0.30 |
| 1,000 tenders | 1,000 | $5.00 |

In `newOrChanged` mode, unchanged tenders are not returned, so you are not charged for them. Use `maxItems` to cap spending.

### FAQ

**Where does the data come from?**
From official open-data feeds on [DATA.GOV.HK](https://data.gov.hk): [GLD e-Tender Box](https://data.gov.hk/en-data/dataset/hk-gld-gldetb-gldetb-tendernotice), [ArchSD Tender Notices](https://data.gov.hk/en-data/dataset/hk-archsd-archsddata-tngg) and [HKMA Tender Invitations](https://data.gov.hk/en-data/dataset/hk-hkma-tenderinvi-tender-invitations).

**Is it legal to use this data commercially?**
The [DATA.GOV.HK Terms and Conditions](https://data.gov.hk/en/terms-and-conditions) allow commercial and non-commercial use with attribution. Each record includes an `attribution` field. Intellectual property rights in the data belong to the Government of the HKSAR and the relevant organisations. This Actor is not affiliated with the HKSAR Government. Always check the official tender documents before you bid.

**How often is the data updated?**
The GLD e-Tender Box feed updates several times a day. ArchSD and HKMA update when new notices are issued. Every run reads the live feeds, so a daily schedule is usually enough. Run it more often if you need to.

**How does "only new or changed" work?**
With `mode = newOrChanged`, the Actor remembers which tenders it has already seen in the key-value store named in `stateStoreName`. On the next run it returns only new tenders and tenders whose content changed, such as a revised closing date or an addendum. Use a different store name for each alert.

**Can I get past tenders?**
Set `onlyOpen` to `false`. ArchSD notices go back to 2020. The GLD feed shows current tenders only.

**Why do some HKMA or ArchSD records have empty dates?**
The HKMA feed has no closing date and ArchSD has no issue date. Choose `dateField` to match the source.

***

### 中文说明：香港政府招标公告爬虫

**一键获取香港政府所有在招项目（中英双语），并在有新招标或招标变更时自动提醒。**

- **数据来源**：DATA.GOV.HK 官方开放数据，包括政府物流服务署电子投标箱（覆盖多个部门）、建筑署工程招标和香港金融管理局。
- **适合**：投标供应商、承建商、销售团队、招标信息平台和 AI 自动化流程。
- **功能**：可按关键词（中英文）、部门、截标或发布日期筛选。`newOrChanged` 模式只返回新增或有变更的招标，比如截标日期改了或发了补充文件。不输出电话、电邮和联络人等个人信息，每条记录都附有数据来源声明。
- **价格**：每条招标 $0.005，即 1,000 条 $5。启动费用很低，几乎可以不计。

# Actor input Schema

## `sources` (type: `array`):

Which official open-data feeds to read. GLD_ETB = Government Logistics Department e-Tender Box (covers many bureaux/departments), ARCHSD = Architectural Services Department works tenders, HKMA = Hong Kong Monetary Authority tender invitations and award notices.

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

Return only tenders whose subject, reference or remarks contain at least one keyword (case-insensitive, English or Chinese), e.g. "cleaning", "IT", "系統". Leave empty for all.

## `departments` (type: `array`):

Return only tenders where the issuing or requisitioning bureau/department name contains one of these strings, e.g. "Hospital", "Fire Services", "衞生署". Leave empty for all.

## `mode` (type: `string`):

"all" returns every matching tender. "newOrChanged" returns only tenders that are new or whose content (closing date, status, subject, addendum flag...) changed since the previous run with the same state store name. Ideal for scheduled daily alerts.

## `onlyOpen` (type: `boolean`):

Skip tenders whose closing date has passed, and cancelled or suspended tenders. Turn off to also get ArchSD historical notices (back to 2020).

## `dateField` (type: `string`):

Which date the date range filters on. Note: ArchSD notices have no issue date; HKMA notices have no closing date.

## `dateFrom` (type: `string`):

Earliest date (YYYY-MM-DD, Hong Kong time) or relative, e.g. "7 days".

## `dateTo` (type: `string`):

Latest date (YYYY-MM-DD, Hong Kong time).

## `stateStoreName` (type: `string`):

Name of the key-value store that remembers what you have already seen (used by "newOrChanged" mode). Use a different name for each saved task/filter set.

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

Maximum number of tenders to return. 0 = no limit.

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

Not needed for these government feeds. Provided only in case a feed starts blocking datacenter IPs.

## Actor input object example

```json
{
  "sources": [
    "GLD_ETB",
    "ARCHSD",
    "HKMA"
  ],
  "keywords": [],
  "mode": "all",
  "onlyOpen": true,
  "dateField": "closingDate",
  "stateStoreName": "hk-gov-tenders-state",
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Tender records (bilingual EN/中文) from GLD e-Tender Box, ArchSD and HKMA, with change-detection fields. One dataset item per tender.

# 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 = {
    "keywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("brazen_outcome_iye/hk-gov-tenders").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 = { "keywords": [] }

# Run the Actor and wait for it to finish
run = client.actor("brazen_outcome_iye/hk-gov-tenders").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 '{
  "keywords": []
}' |
apify call brazen_outcome_iye/hk-gov-tenders --silent --output-dataset

```

## MCP server setup

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

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/YoUTaoRp3wFClSz0x/builds/QRqDRHkFrvM9FQbbe/openapi.json
