# JobsDB Scraper — Hong Kong Jobs & Salary Data (`hkdatafeeds/hong-kong-jobs-scraper`) Actor

Scrape JobsDB Hong Kong job listings with salaries parsed into numbers (HKD min/max/period), normalised districts and industry classifications. Employer-side data only, no login.

- **URL**: https://apify.com/hkdatafeeds/hong-kong-jobs-scraper.md
- **Developed by:** [Feeds HK Data](https://apify.com/hkdatafeeds) (community)
- **Categories:** Jobs, Lead generation, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.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.

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

## JobsDB Scraper — Hong Kong Jobs & Salary Data

**Scrape live JobsDB Hong Kong job listings with salary data you can actually sort and compare.**
Enter a keyword like `accountant`, press Start, and get structured listings with
**parsed HKD salary ranges**, **normalised districts**, industries and employer names —
as JSON, CSV or Excel.

Employer-side listings only. No candidate data, no personal data, no login required.

### What this Actor does

JobsDB, Hong Kong's largest job board, publishes pay as inconsistent free text and labels the same
district several different ways. Scrape it yourself and you get strings you cannot sort and
location buckets that silently split apart. This Actor fixes both problems before the data
reaches you.

- 🔍 **33,000+ live listings** — search by keyword, filter by industry, or take the whole board
- 💰 **Salary parsed into numbers** — `$25,000 – $30,000 per month` becomes `salary_min: 25000`, `salary_max: 30000`, `salary_period: "month"`
- 📍 **Districts normalised** to Hong Kong's 18 official districts, so per-district aggregates are correct
- 🏢 **Employer and industry fields** — company name, classification, subclassification
- 🕐 **Work type and arrangement** — full time / part time / contract, on-site / hybrid / remote
- 📅 **Listing date** — build a time series by scheduling daily runs
- 🚫 **No personal data** — employer-side listings only

Because it runs on Apify, you also get scheduling, run monitoring, a REST API, webhooks,
and integrations with Make, Zapier, Google Sheets, Slack, Airbyte and others — without
hosting anything yourself.

### How to use it (3 steps)

1. Click **Try for free** and sign in to Apify Console.
2. Type a keyword into **Search keywords** (for example `accountant`) and set **Maximum listings**.
3. Click **Start**. When the run finishes, open the **Dataset** tab and export as JSON, CSV,
   Excel, HTML or XML — or pull it straight from the API.

To scrape a whole industry instead of a keyword, leave the keyword empty and put an industry
id in **Industry classification ID** (see the table below).

#### Industry classification IDs

The 12 largest of 30 industries, with live listing counts (24 September 2026). The other 18 are
listed in the input field's description; every listing belongs to exactly one industry.

| ID | Industry | Jobs | ID | Industry | Jobs |
|---|---|---|---|---|---|
| `1203` | Banking & Financial Services | 4,648 | `6008` | Marketing & Communications | 1,898 |
| `6281` | Information & Communication Technology | 3,870 | `6092` | Manufacturing, Transport & Logistics | 1,847 |
| `6251` | Administration & Office Support | 2,647 | `6043` | Retail & Consumer Products | 1,433 |
| `1200` | Accounting | 2,242 | `6123` | Education & Training | 1,262 |
| `6362` | Sales | 2,180 | `1206` | Construction | 1,111 |
| `1209` | Engineering | 1,945 | `1212` | Hospitality & Tourism | 1,055 |

### Input example

```json
{
  "keywords": "accountant",
  "classification": "1200",
  "maxItems": 500,
  "requestDelaySeconds": 1
}
```

All fields are optional. With everything empty and **Maximum listings** set to 35000, the Actor
walks the whole board. The source stops paging at 30,000 results, so above that the Actor searches
industry by industry, which still reaches every listing.

### Output example

A real row, straight out of the Actor:

```json
{
  "job_id": "94815059",
  "title": "Senior Financial Accountant",
  "company": "Fusion Asia HK Limited",
  "salary_label": "$30,000 – $35,000 per month",
  "salary_min": 30000,
  "salary_max": 35000,
  "salary_period": "month",
  "currency": "HKD",
  "districts": ["Causeway Bay, Wan Chai District"],
  "district_normalised": ["Wan Chai"],
  "classification": "Accounting",
  "subclassification": "Financial Accounting & Reporting",
  "work_types": ["Full time"],
  "work_arrangements": ["On-site"],
  "listing_date": "2026-09-23T02:10:49Z",
  "teaser": "Experienced Senior Financial Accountant for day-to-day finance function in Hong Kong.",
  "url": "https://hk.jobsdb.com/job/94815059",
  "scraped_at": "2026-09-24T04:52:34+00:00"
}
```

#### Why `salary_min` / `salary_max` matter

The source publishes pay in at least five formats — `$25,000 – $30,000`,
`HKD 30000 - 35000 per month`, `45K - 55K`, hourly rates and daily rates. This Actor parses
all of them into comparable integers, so you can sort, filter and average without writing
your own parser.

#### Why `district_normalised` matters

`Central and Western District`, `Central, Central and Western District` and
`Admiralty, Central and Western District` are all the same place. Aggregate on the raw labels
and one district becomes three buckets, hiding the signal. From a whole-board run on 24 September
2026: every Accounting listing that states a monthly salary (432 of them), grouped by normalised
district (districts with 20 or more listings; median of each advertised range's midpoint):

| District | Listings | Median monthly (HKD) |
|---|---|---|
| Central and Western | 133 | 37,500 |
| Wan Chai | 55 | 30,000 |
| Yau Tsim Mong | 41 | 22,500 |
| Kwai Tsing | 21 | 22,500 |
| Kwun Tong | 35 | 21,500 |
| Kowloon City | 21 | 21,500 |

An accounting job in Central and Western advertises **74% more** than one in Kwun Tong. Without
normalisation that comparison is not visible.

### How much does it cost to scrape Hong Kong jobs?

This Actor is priced **per result**, so the cost is easy to predict: you pay for the listings
you receive, and nothing for platform compute.

| Listings | Cost |
|---|---|
| 1,000 | $0.50 |
| 5,000 | $2.50 |
| 33,000 (whole board) | ~$16.50 |

New Apify accounts start with free platform credit, so you can try a few hundred listings
before paying anything. A typical salary-benchmarking run (500–1,000 listings for one role)
costs well under a dollar.

The Actor never goes past your **Maximum cost per run**: it stops at the number of listings that
budget pays for and says so on the run page.

### Use cases

- **Salary benchmarking** — what a role pays in Hong Kong, and which district pays most
- **Recruitment market intelligence** — hiring volume by industry, employer and month
- **Competitor hiring tracking** — which companies are expanding which teams
- **HR and compensation planning** — evidence for pay bands in offers and reviews
- **Relocation and career research** — pay versus location
- **AI training data** — structured, labelled listings for job-matching models

### FAQ

**Is scraping job listings legal?**
This Actor collects publicly available job advertisements — employer-side content that anyone
can view without logging in. It does not collect candidate profiles, applications or any
personal data. You are responsible for how you use the output; check your own jurisdiction's
rules before republishing.

**Why do so few listings have a salary?**
About one in five Hong Kong job ads publish pay (19.5% of 33,231 listings on a whole-board run on
24 September 2026). That is the local market convention, not a defect in this Actor. When you need paid ranges, request more listings than you need and filter
on `salary_min`.

**Can I get historical data?**
Each run is a snapshot of what is live at that moment; the Actor keeps no history. Schedule a
daily run and your dataset becomes a time series you own.

**What language is the output in?**
Listing text is returned exactly as published — mostly English, with some Traditional Chinese.
Field names and district names are always English.

**Can I use this via API?**
Yes. Every Apify Actor has a REST API, so you can trigger runs and pull results from your own
code, or use the Apify integrations for Make, Zapier, Google Sheets, Slack and others.

**Is there an official JobsDB API?**
JobsDB does not offer a public API for job listings. This Actor gives you the same public
listings through Apify's REST API: start a run from your code, then read the dataset as JSON, CSV or Excel.

**Can you add another field or another site?**
Open an issue on the Issues tab. Requests for extra fields, or for a scraper covering another
Hong Kong data source, are welcome.

### 中文簡介

JobsDB 香港職位爬蟲。輸入職位關鍵字或行業，即可匯出 JobsDB 上的招聘廣告：職位名稱、公司、行業、工作類型，
以及已轉換成數字的月薪範圍（港幣最低及最高）和統一的 18 區地區名稱，可下載 JSON、CSV 或 Excel。
毋須寫程式，毋須登入。

適合：薪酬調查、HR 定薪參考、招聘市場分析、追蹤競爭對手的招聘動向。

收費：每 1,000 個職位 US$0.50，另加每次 US$0.002 啟動費。只收集僱主刊登的公開招聘資料，不包括任何求職者資料。

### Related Actors

| Actor | What it does |
|---|---|
| [OpenRice Scraper — Hong Kong Restaurant Data](https://apify.com/hkdatafeeds/hong-kong-restaurants-scraper) | ~29,000 open HK restaurants with review scores, HKD price bands, opening hours and GPS coordinates |

### Support

Report problems on the **Issues** tab. Bugs in salary parsing or district normalisation are
treated as priority — those two fields are the whole point of this Actor.

# Actor input Schema

## `keywords` (type: `string`):

Free-text search, e.g. 'accountant', 'python developer'. Leave empty to scrape the whole board (33,000+ live listings).

## `classification` (type: `string`):

Optional industry filter. 1200 = Accounting; 6251 = Administration & Office Support; 6304 = Advertising, Arts & Media; 1203 = Banking & Financial Services; 1204 = Call Centre & Customer Service; 7019 = CEO & General Management; 6163 = Community Services & Development; 1206 = Construction; 6076 = Consulting & Strategy; 6263 = Design & Architecture; 6123 = Education & Training; 1209 = Engineering; 6205 = Farming, Animals & Conservation; 1210 = Government & Defence; 1211 = Healthcare & Medical; 1212 = Hospitality & Tourism; 6317 = Human Resources & Recruitment; 6281 = Information & Communication Technology; 1214 = Insurance & Superannuation; 1216 = Legal; 6092 = Manufacturing, Transport & Logistics; 6008 = Marketing & Communications; 6058 = Mining, Resources & Energy; 1220 = Real Estate & Property; 6043 = Retail & Consumer Products; 6362 = Sales; 1223 = Science & Technology; 6261 = Self Employment; 6246 = Sport & Recreation; 1225 = Trades & Services.

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

Hard cap on how many listings to return. The whole board is about 33,000 live listings; above 30,000 the Actor splits the search by industry to get past the source's paging limit. The run also stops at the number of listings your Maximum cost per run pays for.

## `requestDelaySeconds` (type: `integer`):

Politeness delay. Keep at 1 or higher to stay well-behaved.

## Actor input object example

```json
{
  "keywords": "accountant",
  "classification": "1200",
  "maxItems": 100,
  "requestDelaySeconds": 1
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped listings as JSON. Each item contains title, company, salary\_label, salary\_min, salary\_max, salary\_period, currency, districts, district\_normalised, classification, subclassification, work\_types, work\_arrangements, listing\_date, teaser and url.

# 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": "accountant",
    "maxItems": 100,
    "requestDelaySeconds": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("hkdatafeeds/hong-kong-jobs-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 = {
    "keywords": "accountant",
    "maxItems": 100,
    "requestDelaySeconds": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("hkdatafeeds/hong-kong-jobs-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 '{
  "keywords": "accountant",
  "maxItems": 100,
  "requestDelaySeconds": 1
}' |
apify call hkdatafeeds/hong-kong-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hkdatafeeds/hong-kong-jobs-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/3ilKaxxr3kfDENqVi/builds/t3cayMwWgasfJc4VY/openapi.json
