JobsDB Hong Kong & Thailand Jobs Scraper
Pricing
Pay per event
JobsDB Hong Kong & Thailand Jobs Scraper
Search JobsDB Hong Kong and Thailand by keyword and location, then export normalized vacancy records for recruiting and hiring-market monitoring.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Export current jobsdb jobs from Hong Kong and Thailand as normalized vacancy records. Search by role or skill, narrow the search by location, and send structured results to spreadsheets, recruiting workflows, dashboards, or hiring-market monitoring systems.
The Actor uses the anonymous JobsDB search feed. It does not need a JobsDB account and does not open every detail page. This listing-focused scope keeps runs fast while preserving the fields most useful for vacancy discovery and recurring market analysis.
What can this JobsDB jobs scraper do?
- Search Hong Kong, Thailand, or both country feeds.
- Apply a keyword and an optional location such as
Bangkok,Central, orKowloon. - Paginate through current public search results up to a user-set limit.
- Export stable job IDs, titles, employers, locations, salary labels, work types, classifications, highlights, dates, and links.
- Deduplicate records by source country and JobsDB job ID.
- Produce a consistent default dataset for API, spreadsheet, webhook, and scheduled-run workflows.
The Actor extracts search-result vacancy data only. Full job-description enrichment, login-only data, saved jobs, applications, and employer account features are outside this version's scope.
Who is it for?
Recruiters and talent teams
Build focused lists of open roles, identify active employers, and compare hiring demand between Hong Kong and Thailand.
Labor-market and strategy analysts
Schedule the same query repeatedly and compare datasets to monitor new listings, salary signals, location patterns, or category changes.
Job aggregators and data engineers
Feed normalized JobsDB records into a warehouse, spreadsheet, CRM, search index, or internal vacancy product without maintaining browser automation.
Researchers and journalists
Collect a reproducible snapshot of public vacancy search results for a defined keyword and geography.
Why use this Actor?
The public JobsDB search pages can be protected by browser checks. This Actor uses the underlying anonymous search-data operation instead of downloading detail pages or rendering a browser. That provides:
- lower memory and runtime than full-page browser crawling;
- exact pagination totals and stable source IDs;
- consistent field names across Hong Kong and Thailand;
- no automatic residential proxy charges;
- explicit errors when the upstream response is invalid rather than silent empty output.
What JobsDB data is extracted?
| Field | Meaning |
|---|---|
jobId | Stable JobsDB vacancy ID |
title | Vacancy title |
employer | Employer or advertiser name, when disclosed |
country | HK or TH source feed |
location | JobsDB location label |
workTypes | Employment-type labels |
workArrangement | Remote, hybrid, or on-site label when available |
classification | Top-level job category |
subclassification | More specific category |
salary | Displayed salary text when disclosed |
benefits | Search-card highlights and benefits |
summary | Short listing teaser |
listedAt | Source listing timestamp |
jobUrl | Canonical public vacancy URL |
applyUrl | JobsDB application route |
searchQuery | Query that produced the row |
scrapedAt | Extraction timestamp |
JobsDB does not disclose every optional value on every listing. Missing optional values are returned as null or an empty array rather than invented.
How to run the scraper
- Open the Actor in Apify Console.
- Enter a role or skill in Job keywords.
- Optionally enter a JobsDB location.
- Select Hong Kong, Thailand, or both.
- Set the maximum number of records.
- Click Start.
- Open the Job listings dataset view or export it as JSON, CSV, Excel, XML, or RSS.
A useful first input is:
{"query": "data analyst","countries": ["HK", "TH"],"maxItems": 50}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
query | string | data analyst | Required role, skill, or phrase; 2–200 characters |
location | string | none | Optional location text understood by JobsDB |
countries | array | ["HK", "TH"] | One or both supported country feeds |
maxItems | integer | 50 | Maximum unique records across selected feeds; 1–1,000 |
When both feeds are selected, the Actor reserves a fair share of the limit for each country. The final feed can use capacity left by an earlier naturally sparse search.
Output example
A current run returns rows shaped like this:
{"jobId": "94071473","title": "Software Engineer (Node.js & React.js)","employer": "AVA Intelligent Partners Limited","country": "HK","location": "Wan Chai, Wan Chai District","workTypes": ["Full time"],"workArrangement": null,"classification": "Information & Communication Technology","subclassification": "Developers/Programmers","salary": null,"benefits": ["Solid experience in React, Node.js, TypeScript","2-4 years relevant experience in programming"],"summary": "Build scalable web apps with Node.js & React.js.","listedAt": "2026-08-19T04:33:51.000Z","jobUrl": "https://hk.jobsdb.com/job/94071473","applyUrl": "https://hk.jobsdb.com/job/94071473/apply","searchQuery": "software engineer","scrapedAt": "2026-08-19T20:40:00.000Z"}
The example demonstrates the schema; live listings can change or expire after a run.
How much does it cost to extract JobsDB job listings?
The Actor uses pay-per-event pricing: one small start event per run and one item event per unique vacancy saved. Failed, duplicate, or rejected source rows are not charged as items.
Your exact item rate depends on your Apify pricing tier and is shown before starting a run. At the Bronze rate of $0.000792 per item plus the $0.005 start event:
| Saved vacancies | Example total |
|---|---|
| 10 | $0.01292 |
| 100 | $0.08420 |
| 1,000 | $0.79700 |
These examples describe Actor event charges. Apify plan terms may separately apply. Check the live pricing panel for your tier before a large run.
Recurring monitoring workflow
- Create a task with a stable query, countries, location, and limit.
- Add a daily or weekly schedule.
- Send completed-run data to your webhook, integration, or warehouse.
- Compare
country + jobIdwith the previous snapshot. - Flag new IDs, removed IDs, changed salary labels, or shifts in employer activity.
The Actor returns snapshots. It does not retain historical changes or send alerts itself; those are downstream workflow decisions.
Spreadsheet and data-pipeline exports
Use the dataset export menu for CSV or Excel. For an automated pipeline, read the run's default dataset through the Apify API. Stable field names make it straightforward to load records into BigQuery, Snowflake, PostgreSQL, Airtable, Google Sheets, or a search index.
For deduplication outside one run, use the composite key country + jobId. The same numeric ID should not be assumed globally unique across unrelated sources.
Run with the Apify API
Replace YOUR_TOKEN with your Apify token.
cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~jobsdb-hk-th-job-listings-retry/runs?token=YOUR_TOKEN&waitForFinish=120" \-H "Content-Type: application/json" \-d '{"query":"cybersecurity","countries":["HK","TH"],"maxItems":50}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/jobsdb-hk-th-job-listings-retry').call({query: 'cybersecurity',countries: ['HK', 'TH'],maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("automation-lab/jobsdb-hk-th-job-listings-retry").call(run_input={"query": "data analyst","location": "Bangkok","countries": ["TH"],"maxItems": 50,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
Use with Apify MCP
Add the Actor to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/jobsdb-hk-th-job-listings-retry"
Claude Desktop, Cursor, and VS Code MCP setup
Claude Desktop, Cursor, and VS Code can use the same remote MCP server configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/jobsdb-hk-th-job-listings-retry"}}}
Example prompts:
- “Search JobsDB for 30 data analyst vacancies in Bangkok and summarize the hiring companies.”
- “Export 100 cybersecurity vacancies from Hong Kong and Thailand and group them by classification.”
- “Run my JobsDB monitoring task and identify job IDs not present in the previous dataset.”
Limits and failure behavior
- Only anonymous public JobsDB Hong Kong and Thailand search feeds are supported.
maxItemsis capped at 1,000 per run.- Location matching follows JobsDB's own search interpretation and is not a custom geocoder.
- Thailand fields can contain Thai-language labels.
- Salary, work arrangement, benefits, and some employer fields are optional at the source.
- Listings can expire or be removed after extraction.
- Full detail descriptions are intentionally excluded.
- The Actor retries temporary upstream failures three times, then fails non-zero instead of returning a misleading successful empty dataset.
Performance tips
- Use a specific role phrase instead of a broad single word.
- Add a location when you need a city or district rather than country-wide results.
- Start with a modest
maxItemswhile designing a downstream workflow. - Use scheduled tasks for repeated inputs rather than manually recreating runs.
- Avoid assuming a displayed salary label uses one currency; interpret it with the
countryfield.
Legality and responsible use
JobsDB content may be subject to website terms, database rights, copyright, privacy rules, and local law. Extract only public information you have a lawful reason to process. Do not use the Actor for spam, discrimination, harassment, automated applications, or attempts to access private accounts. Minimize retention and protect exported data. You are responsible for your inputs and downstream use.
FAQ and troubleshooting
Why did my run return fewer results than requested?
The source may have fewer matching vacancies, filters may narrow the feed, or duplicate IDs may occur across pagination. Check the query and location, then inspect the run log's source totals.
Why is a salary or work arrangement missing?
JobsDB does not disclose these values for every search result. Missing source values remain null; the Actor does not infer compensation or remote status.
Why did the run fail instead of returning zero rows?
An invalid or challenged upstream response is different from a valid no-result search. The Actor fails after bounded retries so scheduled workflows can alert on a source problem rather than accepting a false empty snapshot.
Does this Actor apply for jobs?
No. It exports public vacancy search records and URLs. Applications, saved jobs, login-only features, and employer workflows are not supported.
Does it scrape full descriptions?
No. V1 deliberately uses search-result records, including the source summary and highlights. This makes regional monitoring faster and less expensive than visiting every detail page.
Related Actors
For broader recruiting automation, explore other public job-feed Actors from automation-lab on Apify. Choose a source-specific Actor when you need another job board; combine datasets downstream using stable source and job identifiers.
Support
If a valid public JobsDB query repeatedly fails, open an Actor issue with the input (remove secrets), run ID, expected country feed, and the relevant log excerpt. Do not include Apify tokens or private candidate data.