# HKEXnews Listed Company Filings Scraper (`jungle_synthesizer/hkexnews-listed-company-filings-scraper`) Actor

Pulls statutory disclosure filings from HKEXnews, Hong Kong's disclosure portal for SEHK Main Board and GEM listed issuers. Returns announcements, circulars, and financial statements with PDF links and category codes, filterable by date range, board, and disclosure category.

- **URL**: https://apify.com/jungle_synthesizer/hkexnews-listed-company-filings-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

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

## HKEXnews Listed Company Filings Scraper

Scrape statutory disclosure filings from [HKEXnews](https://www1.hkexnews.hk), the single disclosure portal for every SEHK Main Board and GEM listed issuer in Hong Kong. Returns announcements, circulars, financial statements, and other filings with PDF/document links, stock identifiers, and category codes, going back to 2000.

***

### HKEXnews Filings Scraper Features

- Returns every filing type HKEXnews publishes — announcements, circulars, financial statements, next-day disclosure returns, proxy forms, and more.
- Resolves each filing's category text to HKEX's own numeric `t1_code`/`t2_code` taxonomy.
- Filters by date range, board (Main Board / GEM), and up to 20 disclosure categories.
- Links every record to its stock code and company name, when the filing is issuer-specific.
- Covers the full exchange history back to 2000 — pick any window, from a single day to decades.

***

### Who Uses HKEXnews Filings Data?

- **Equity research analysts** — track new disclosures for a watchlist of HK-listed names without refreshing a search page by hand.
- **China/HK-focused funds** — screen profit warnings, M\&A circulars, and connected-transaction announcements across the whole exchange.
- **Credit analysts** — pull financial statements and ESG filings for issuers you're underwriting.
- **Compliance teams** — build an audit trail of a company's regulatory announcements over time.
- **Data engineers** — feed structured filing metadata and document links into an internal research pipeline instead of parsing the search page yourself.

***

### How HKEXnews Filings Scraper Works

1. Set a date range, and optionally narrow by board or disclosure category.
2. The scraper walks the range day by day and returns every matching filing, newest first.
3. Each record carries the filing's title, category, document link, and (when applicable) the stock code and company name.
4. Stop anytime with `maxItems` — you're only charged for the records actually returned.

***

### Input

```json
{
  "maxItems": 50,
  "fromDate": "2024-10-01",
  "toDate": "2024-10-10",
  "markets": ["SEHK", "GEM"],
  "headlineCategories": []
}
```

| Field                | Type    | Default             | Description |
|----------------------|---------|---------------------|-------------|
| `maxItems`           | Integer | `10`                | Maximum number of filing records to return across the selected date range, markets, and categories. |
| `fromDate`           | String  | 7 days before today | Earliest filing date to include (`YYYY-MM-DD`). |
| `toDate`             | String  | today               | Latest filing date to include (`YYYY-MM-DD`). |
| `markets`            | Array   | `["SEHK", "GEM"]`   | Which board(s) to include. `SEHK` is the Main Board, `GEM` is the Growth Enterprise Market. Both are selected by default for full exchange coverage. |
| `headlineCategories` | Array   | `[]` (all)          | Filter to specific disclosure categories (e.g. `"Circulars"`, `"Financial Statements/ESG Information"`). Leave empty to return every category. |

Filtering to a single board and a narrow category, for example:

```json
{
  "maxItems": 20,
  "fromDate": "2025-01-01",
  "toDate": "2025-03-31",
  "markets": ["GEM"],
  "headlineCategories": ["Circulars"]
}
```

***

### HKEXnews Filings Scraper Output Fields

```json
{
  "news_id": "11402761",
  "stock_code": "00389",
  "stock_name": "TONTINE WINES",
  "title": "REQUISITION TO CONVENE A SPECIAL GENERAL MEETING OF THE COMPANY BY A SHAREHOLDER",
  "long_text": "Announcements and Notices - [Inside Information]",
  "short_text": "Announcements and Notices - [Inside Information]",
  "document_url": "https://www1.hkexnews.hk/listedco/listconews/sehk/2024/1010/2024101001081.pdf",
  "file_type": "PDF",
  "file_size": "63KB",
  "date_time": "10/10/2024 22:57",
  "headline_category": "Announcements and Notices",
  "t1_code": "10000",
  "t2_code": "19010",
  "market": "SEHK",
  "scraped_at": "2026-10-15T10:15:28.862Z"
}
```

| Field               | Type   | Description                                                                                              |
|---------------------|--------|----------------------------------------------------------------------------------------------------------|
| `news_id`           | String | HKEXnews' internal filing ID.                                                                            |
| `stock_code`        | String | The issuer's stock code, when the filing is tied to a specific company. Blank for exchange-wide filings. |
| `stock_name`        | String | The issuer's short name, when applicable.                                                                |
| `title`             | String | The filing's headline/title.                                                                             |
| `long_text`         | String | Full category and subcategory text as published.                                                         |
| `short_text`        | String | Short category and subcategory text as published.                                                        |
| `document_url`      | String | Direct link to the filed document (PDF, XLSX, or HTM).                                                   |
| `file_type`         | String | Document file type (e.g. `PDF`, `XLSX`).                                                                 |
| `file_size`         | String | Document file size as published (e.g. `63KB`).                                                           |
| `date_time`         | String | Filing release date/time, Hong Kong local time.                                                          |
| `headline_category` | String | The filing's top-level disclosure category.                                                              |
| `t1_code`           | String | HKEX's numeric code for the top-level category.                                                          |
| `t2_code`           | String | HKEX's numeric code for the subcategory, when one applies.                                               |
| `market`            | String | `SEHK` (Main Board) or `GEM`, derived per filing.                                                        |
| `scraped_at`        | String | ISO-8601 timestamp when the record was scraped.                                                          |

***

### FAQ

#### How do I scrape HKEXnews filings?

HKEXnews Filings Scraper needs no account, login, or API key. Set a date range (or use the default last-7-days window) and run it — you get back every matching filing as structured JSON, with document links included.

#### How much does this cost to run?

Pricing is per record returned, so a narrow date range or category filter costs proportionally less. There's no separate charge for the date-range or category filtering itself.

#### Can I filter by stock exchange board?

Yes. Set `markets` to `["SEHK"]` for Main Board only, `["GEM"]` for GEM only, or leave both selected (the default) for the full exchange.

#### Can I filter by disclosure category?

Yes, via `headlineCategories` — choose from categories like Announcements and Notices, Circulars, Financial Statements/ESG Information, Proxy Forms, and 16 others. Leave it empty to get every category.

#### How far back does the data go?

HKEXnews' title-search index goes back to 2000. Set `fromDate` to any date in that range — a multi-year pull just takes a wider date window and more run time.

#### Do I need a stock code to use this?

No. The scraper indexes by date, board, and category, not by individual stock — you get the whole disclosure stream for the window you set, across every listed issuer at once.

***

### Need More Features?

Need custom fields, filters, or a different target site? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use HKEXnews Filings Scraper?

- **Full taxonomy, not a screener** — other HKEX actors on the store cover IPO calendars, insider trades, and stock screeners. This one is the document layer underneath: every statutory filing, with HKEX's own category codes attached.
- **Covers the whole exchange, not one company** — set a date window and get every SEHK/GEM issuer's filings in it, rather than polling one stock code at a time.
- **Clean, typed output** — category codes, board, document type, and file size all arrive pre-parsed, so you're not scraping HTML or guessing at a category string yourself.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

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

Maximum number of filing records to return across the selected date range, markets, and categories.

## `fromDate` (type: `string`):

Earliest filing date to include (YYYY-MM-DD). Leave empty to default to 7 days before today.

## `toDate` (type: `string`):

Latest filing date to include (YYYY-MM-DD). Leave empty to default to today.

## `markets` (type: `array`):

Which HKEX board(s) to include. Both boards selected by default for full exchange coverage.

## `headlineCategories` (type: `array`):

Filter to specific HKEXnews disclosure categories. Leave empty for all categories.

## Actor input object example

```json
{
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "markets": [
    "SEHK",
    "GEM"
  ],
  "headlineCategories": []
}
```

# Actor output Schema

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

No description

# 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 = {
    "sp_contact": "Share your email here...",
    "maxItems": 10,
    "fromDate": "",
    "toDate": "",
    "markets": [
        "SEHK",
        "GEM"
    ],
    "headlineCategories": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/hkexnews-listed-company-filings-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 = {
    "sp_contact": "Share your email here...",
    "maxItems": 10,
    "fromDate": "",
    "toDate": "",
    "markets": [
        "SEHK",
        "GEM",
    ],
    "headlineCategories": [],
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/hkexnews-listed-company-filings-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 '{
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "fromDate": "",
  "toDate": "",
  "markets": [
    "SEHK",
    "GEM"
  ],
  "headlineCategories": []
}' |
apify call jungle_synthesizer/hkexnews-listed-company-filings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/hkexnews-listed-company-filings-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/vX4cJUS5LIGu1NWI4/builds/23i2eb7CvUg5fvVpH/openapi.json
