JobsDB Job Scraper: Hong Kong & Thailand Jobs avatar

JobsDB Job Scraper: Hong Kong & Thailand Jobs

Pricing

from $0.48 / 1,000 jobs

Go to Apify Store
JobsDB Job Scraper: Hong Kong & Thailand Jobs

JobsDB Job Scraper: Hong Kong & Thailand Jobs

Collect JobsDB ads from Hong Kong and Thailand in one run, without a login. Every row carries the district, work type, the monthly salary in HK$ or THB parsed to min and max, applicant numbers, employer profile and the ad text in Thai, Chinese or English. JSON, CSV, Excel, scheduled, paid per job.

Pricing

from $0.48 / 1,000 jobs

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

JobsDB Job Scraper: Hong Kong & Thailand Jobs

JobsDB Job Scraper turns any JobsDB search into clean JSON, CSV or Excel across Hong Kong and Thailand (hk.jobsdb.com and th.jobsdb.com): title, employer, salary parsed to a minimum and maximum, full description, applicant numbers, employer industry and size, exact posting dates and structured locations. No login, no API key, billed once per job.

Built to be complete and fair:

  • Complete. JobsDB stops every search at 550 results, even when it reports thousands. This Actor detects that wall and automatically splits the search (by sub-category, work type, salary band and region) until every matching job is reached. Most other scrapers silently return the first 550.
  • Deduplicated, billed once. Duplicates inside a run are removed. Give your search a memory name and jobs you already received are skipped in every later run. You never pay twice for the same job.
  • Filter by employer, not just by job. Industry (the site's own employer taxonomy), employer name, rating, recruitment agencies on or off, private advertisers on or off.
  • Honest about what you get. Every run ends with a summary of coverage and how often each field was populated. The table below tells you what to expect per market before you spend a cent.

Also covers SEEK (Australia, New Zealand) and JobStreet (Malaysia, Singapore, Philippines, Indonesia): pick any of the eight markets in the "Countries" dropdown. If you mostly need those markets, the sibling listings at the bottom of this page are the same engine with those defaults.

Quick start (30 seconds)

  1. Pick Countries (🇭🇰 Hong Kong, 🇹🇭 Thailand are preselected) and, if you like, Locations from the list or type your own ("Hong Kong Island").
  2. Pick Job categories (for example "Marketing & Communications") and/or type Keywords ("marketing").
  3. Optional: Employer industries (for example "Online Media & eCommerce", "Specialty Retail").
  4. Choose Posted within (last 24 hours, 3, 7, 14 or 30 days).
  5. Give it a Memory name if you will run it again and only want new jobs.
  6. Start. Download JSON, CSV or Excel from the Dataset tab, or read it through the API.

Prices in one line: $0.60 per 1,000 jobs found, $0.30 per 1,000 for full job details and $0.10 per 1,000 for employer profiles, so $1.00 per 1,000 for a complete record. Duplicates and filtered-out jobs are free and there is no start fee. Full breakdown below.

What you get, per market

AustraliaNew ZealandMalaysia, Singapore, Philippines, IndonesiaHong Kong, Thailand
Job title, employer, teaser, bullet points, category, work type, listing date, URLalwaysalwaysalwaysalways
Full description (HTML, text, Markdown, sections)always with job detailsalwaysalwaysalways
Salary shown on the ad, parsed to min / max / period / currency32% of ads show a salary; usually per year, often "+ super"similar to Australiamost ads show a salary, usually per month (RM, S$, PHP, Rp)many ads show a salary per month (HK$, THB)
Applicant count, share with resume and cover letterappears a few hours after posting; 96% of adssamesamesame
Employer industry, size, website, rating, reviews58% of ads link to an employer profilesimilarsimilar; profiles are common for larger employerssimilar
Suburb / district, region, stateyesyes (region)yes (state or region)yes (district and area)
Postcode96% of ads64% of adsnot published on the sitenot published on the site
On-site / hybrid / remotewhen declared by the advertisersamesamesame
Screening questionswhen the advertiser uses the site's apply flowsamesamesame
Labels in the local languagen/an/aIndonesia: yes (set Label language)Thailand and Hong Kong: yes

Things this Actor deliberately does not do: it does not reveal salary ranges the advertiser chose to hide, does not collect recruiter contact details from profile pages, does not log in or touch anything behind a login, and does not cover Zhaopin (China), which runs on a different platform.

Output

One item per job. Nested objects for developers (salary, classifications, descriptionSections) and flat fields for spreadsheets (salaryMin, salaryMax, state, postcode, companyIndustry...). The last item of every run is a run-summary with coverage, fill rates, filter counts and charges.

Most useful fields:

FieldMeaning
id, url, market, country, brandIdentity. sourceMarket shows where a cross-listed ad originated.
title, normalisedRoleTitle, teaser, bulletPoints, descriptionText, descriptionHtml, descriptionMarkdown, descriptionSectionsThe ad.
listedAt, createdAt, updatedAt, expiresAtISO timestamps (UTC).
classification, subclassification (+ ids)The site's job taxonomy.
location, suburb, area, city, state, stateCode, postcode, locationHierarchyStructured location.
workType, workArrangementFull time / part time / contract / casual; on-site / hybrid / remote.
salaryLabel, salaryMin, salaryMax, salaryPeriod, salaryCurrency, salary.includesSuper, salary.parseConfidence, salary.annualisedMin/MaxSalary as shown and as parsed.
applicantCount, applicantsWithResumePct, applicantsWithCoverLetterPct, applicantVolumeDemand signals.
advertiserName, advertiserId, advertiserIsVerified, isPrivateAdvertiser, isRecruitmentAgencyWho posted it.
companyName, companyIndustry, companySize, companyWebsite, companyPrimaryLocation, companyDescription, companyRating, companyReviewCount, companyAwards, companyProfileUrl, companyLogoUrl, companyHasProfileThe employer.
screeningQuestions, isLinkOut, isSponsored, isFeatured, tagsApplication details and ad flags.
ecommerceSignals, seniority, detectedSkills, visaSponsorship, isRemoteFriendlyDerived signals from the text.
emails, phonesOnly when "Extract emails and phone numbers" is on.
changeType, isDuplicate, firstSeenAt, lastSeenAt, contentHash, searchShardDedup and provenance.

Sample item from a live run:

{
"id": "93099142",
"url": "https://hk.jobsdb.com/job/93099142",
"shareUrl": "https://hk.jobsdb.com/job/93099142?tracking=SHR-WEB-SharedJob-asia-1",
"market": "HK",
"countryCode": "HK",
"country": "Hong Kong",
"brand": "JobsDB",
"sourceMarket": "HK",
"title": "Brand Manager / Assistant Brand Manager (Beauty Brands)",
"normalisedRoleTitle": "Assistant Brand Manager",
"teaser": "The Brand Manager will shape and execute brand strategy, driving Brand Transformation Initiative and elevating our presence in the skincare market.",
"bulletPoints": [],
"descriptionText": "Brand Manager\nTo support our business growth and brand transformation journey, we are now inviting a passionate Brand Manager to join our expanding team. In this leadership role, you will shape and execute our brand strategy, driving our Brand Transformation Initiative and elevating our presence in the skincare market.\n\nWhat You Will Deliver\n- Lead the overall brand strategy and direction to drive ...",
"status": "Active",
"isExpired": false,
"isLinkOut": false,
"isFeatured": false,
"isSponsored": false,
"adType": "ORGANIC",
"displayTags": [],
"tags": [
"Be an early applicant"
],
"roleId": "assistant-brand-manager",
"hasRoleRequirements": true,
"screeningQuestions": [
"Which of the following statements best describes your right to work in Hong Kong?",
"What's your expected monthly basic salary?"
],
"videoUrl": null,
"listedAt": "2026-08-31T08:22:57.197Z",
"listedAtDisplay": "31m ago",
"createdAt": "2026-07-03T01:59:53.777Z",
"updatedAt": "2026-08-31T08:23:50.243Z",
"expiresAt": "2026-10-01T13:59:59.999Z",
"classificationId": "6008",
"classification": "Marketing & Communications",
"subclassificationId": "6009",
"subclassification": "Brand Management",
"classifications": [
{
"classificationId": "6008",
"classification": "Marketing & Communications",
"subclassificationId": "6009",
"subclassification": "Brand Management"
}
],
"location": "Tsim Sha Tsui, Kowloon, Yau Tsim Mong District",
"locationLabel": "Tsim Sha Tsui, Yau Tsim Mong District",
"suburb": "Tsim Sha Tsui",
"area": "Kowloon",
"city": "Yau Tsim Mong District",
"state": "Yau Tsim Mong District",
"stateCode": null,
"postcode": null,
"locationHierarchy": [
"Tsim Sha Tsui Yau Tsim Mong District",
"Yau Tsim Mong District"
],
"workType": "Full time",
"workTypes": [
"Full time"
],
"workTypeId": 242,
"workArrangement": "On-site",
"workArrangements": [
"On-site"
],
"salary": {
"label": null,
"currency": "HKD",
"min": null,
"max": null,
"period": null,
"includesSuper": null,
"isDisclosed": false,
"parseConfidence": 0,
"annualisedMin": null,
"annualisedMax": null
},
"salaryLabel": null,
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": "HKD",
"salaryPeriod": null,
"applicantCount": 123,
"applicantsWithResumePct": 100,
"applicantsWithCoverLetterPct": 24,
"applicantVolume": "high",
"advertiserId": "60763519",
"advertiserName": "Kingstar International Trading Ltd",
"advertiserIsVerified": true,
"advertiserRegistrationDate": "2010-01-22T11:26:54.207Z",
"isPrivateAdvertiser": false,
"isRecruitmentAgency": false,
"companyName": "Kingstar International Trading Ltd",
"companyId": null,
"companySlug": null,
"companyProfileUrl": null,
"companyJobsUrl": "https://hk.jobsdb.com/jobs?companyprofilestructureddataid=682660",
"companyLogoUrl": "https://bx-branding-gateway.cloud.seek.com.au/1b58995d-f864-4dc6-87ce-bfd193c08701.1/jdpLogo",
"companyCoverUrl": null,
"companyIndustry": null,
"companyIndustryRaw": null,
"companySize": null,
"companyWebsite": null,
"companyPrimaryLocation": null,
"companySpecialities": null,
"companyDescription": null,
"companyRating": null,
"companyReviewCount": null,
"companySalaryRating": null,
"companyAwards": [],
"companyHasProfile": false,
"companyOrgId": "682660",
"phoneNumberOnAd": null,
"ecommerceSignals": [],
"seniority": "manager",
"detectedSkills": [
"brand management",
"Agile"
],
"visaSponsorship": null,
"isRemoteFriendly": false,
"detailFetched": true,
"companyProfileFetched": false,
"contentHash": "132a72c910a90d9d",
"searchShard": "root/sub6009",
"searchRank": 1,
"isDuplicate": false,
"changeType": "NEW",
"firstSeenAt": "2026-08-31T08:54:37.013Z",
"lastSeenAt": "2026-08-31T08:54:37.013Z",
"scrapedAt": "2026-08-31T08:54:37.013Z"
}

How much does it cost to scrape JobsDB jobs?

You pay per event, never per run, and this Actor has no start fee.

Charge eventWhat triggers itPrice
Job (job-listing)One new, unique job that matched your filters$0.60 per 1,000
Job detail (job-detail)Full description, applicant insights, screening questions and structured location for one delivered job, when "Include job details" is on$0.30 per 1,000
Employer profile (company-profile)Employer industry, size, website, rating and reviews for one delivered job, charged only when the employer actually has a profile with data$0.10 per 1,000

A complete record (job plus details plus employer profile) is $1.00 per 1,000 jobs. Apify Store plan discounts apply on top: Silver pays 10% less on every event and Gold, Platinum and Diamond pay 20% less, so a complete record costs $0.90 per 1,000 on Silver and $0.80 per 1,000 on Gold and above. Free and Bronze pay the base price.

Always free: duplicates (inside a run and across runs under a memory name), jobs dropped by your filters, employers that turn out to have no profile, the run summary, and a run that finds nothing.

Worked examples: 1,000 jobs with full details and employer profiles = $1.00. 1,000 jobs with "Include job details" and "Include employer profile" switched off = $0.60. A daily scheduled run under a memory name that finds 20 new jobs among 400 already-known ones charges only the 20 new complete records, about $0.02.

Input reference: how the filters map to the site

InputWhat it does
CountriesWhich sites to search. Each country is one dataset; results carry market, country and brand.
LocationsRegions and cities exactly as the site names them (dropdown), or anything you would type into the site's location box. Unresolved entries appear in unresolvedLocations in the run summary.
Job categories / sub-categoriesThe site's classification taxonomy (30 categories, 394 sub-categories). Labels or ids both work through the API.
KeywordsThe site's keyword search.
Work type, work arrangement, salary from/toThe site's own filters. The salary filter also matches ads that hide their salary.
Posted within1 / 3 / 7 / 14 / 30 days use the site's filter. Any other number of days through the API is applied exactly. postedAfter / postedBefore are exact ISO timestamps.
Employer industriesMatched against the employer's company profile. Decide with "Employers without a known industry" whether profile-less employers are excluded (precise) or included (complete).
Must contain / must not containPlain-text filters over title, teaser, bullets, employer and (with job details) the full description.
Search URLsPaste any search, job or company URL from SEEK, JobStreet or JobsDB (old or new domains).
Memory nameThe key that makes repeat runs return only new jobs.
Label languageEnglish, or the site's local language where it has one (Indonesia, Thailand, Hong Kong).

Using the API

Same input as the form. Ids and labels are interchangeable.

curl -X POST "https://api.apify.com/v2/acts/automation_craft~jobsdb-job-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"markets": ["HK"],
"classifications": ["6008"],
"postedWithinDays": "7",
"companyIndustries": ["Online Media & eCommerce", "Specialty Retail"],
"unknownIndustryPolicy": "exclude",
"dedupMemoryName": "ecommerce-marketing-weekly",
"includeDetails": true,
"includeCompanyProfile": true,
"maxItems": 500
}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation_craft/jobsdb-job-scraper').call({
searchUrls: ['https://hk.jobsdb.com/marketing-jobs'.replace(' ', '-')],
postedWithinDays: '3',
dedupMemoryName: 'daily-marketing'.replace(' ', '-'),
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const jobs = items.filter((i) => i.type !== 'run-summary');
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation_craft/jobsdb-job-scraper").call(run_input={
"markets": ["HK"], "keywords": "marketing", "postedWithinDays": "7", "maxItems": 200})
items = [i for i in client.dataset(run["defaultDatasetId"]).iterate_items() if i.get("type") != "run-summary"]

Scheduling: create a Schedule in Apify (daily or weekly) with a memory name set; each run then delivers only the jobs that appeared since the previous run.

Notes on the 550-result wall

JobsDB returns at most 550 results per distinct search and then silently returns empty pages, no matter how many jobs it says exist. This Actor probes the total, and when a search is over the wall it splits it into narrower searches (sub-category, then work type, then salary band, then region) and merges the results, removing duplicates. The run summary reports slices, uniqueJobsSeen and slicesTruncated (which should be empty). Very broad searches (for example a whole country with no filters) can take a few minutes; narrow them with a category or a time window when you can.

FAQ

This Actor only reads listings and employer profiles that JobsDB publishes to anyone, at a polite request rate, and it never logs in or touches anything behind a login. That is not legal advice: use the data in line with the site's terms and the laws that apply to you and to the people in it.

Does JobsDB have a public jobs API?

Nothing you can sign up for, and this Actor does not need one. It reads the public listings the site serves to any visitor, with no key, no cookies and no login, and hands you the result as JSON, CSV or Excel or through the Apify API.

Why does a JobsDB search stop returning jobs after a few hundred results?

Because the site caps every distinct search at 550 results and then serves empty pages while still reporting a much bigger total. This Actor detects the wall and splits the search by sub-category, work type, salary band and region until everything matching is collected, which is what "Notes on the 550-result wall" above describes.

Can I scrape hk.jobsdb.com and th.jobsdb.com in one run?

Yes. Tick the countries you want in the "Countries" dropdown and they run in the same job, into one dataset. Every row carries market, country and brand so you can tell the sites apart afterwards.

How do I export JobsDB jobs to CSV or Excel?

Run the Actor, open the Dataset tab and download CSV, Excel, JSON or XML, or call the dataset API with format=csv. The "Jobs" view lays the most useful columns out as a table; the full record has every field listed under Output above.

Is JobsDB part of SEEK?

Yes. SEEK, JobStreet and JobsDB run on one job platform, which is why this Actor reaches all eight markets from a single "Countries" dropdown: Australia and New Zealand on SEEK, Malaysia, Singapore, the Philippines and Indonesia on JobStreet, Hong Kong and Thailand on JobsDB. A search URL from any of those sites can be pasted into "Search URLs".

Can I get Thai-language job titles and descriptions from JobsDB?

Yes. The ad title and description are always returned in the language the advertiser wrote them in, Thai, Chinese or English. Set "Label language" to "Local language where available" and the site's category and location labels come back in Thai or Chinese too.

Does JobsDB publish salaries on its job ads?

Many Hong Kong and Thailand ads show a monthly salary in HK$ or THB. Those arrive as salaryLabel plus salaryMin, salaryMax, salaryPeriod and salaryCurrency. When the advertiser hides the salary the fields stay empty; the salary filter in the input still matches hidden-salary ads because it is the site's own filter.

How much will it cost to scrape 1,000 JobsDB jobs?

$1.00 for 1,000 complete records (job, full details and employer profile) on the Free and Bronze plans, $0.90 on Silver and $0.80 on Gold and above. Switch the two enrichment options off and 1,000 jobs cost $0.60. Duplicates you already received are never charged again, so a scheduled run only pays for what is new.

Why does this Actor run with limited permissions?

Least privilege. It only reads and writes its own storages: the run's dataset, and, when you set a memory name, a key-value store it creates itself (seek-jobs-memory-v2-<your memory name>). It never needs access to the rest of your Apify account, so it does not ask for it, and schedules and API calls do not raise an approval prompt.

Fair use

This Actor reads publicly available listings and the public employer profiles the site publishes, at a polite request rate (4 per second by default). It never logs in. Use the data in line with the site's terms and the laws that apply to you.

Support

Something missing or wrong? Open an issue on the Actor's Issues tab. Fixes usually ship within a day.

More data tools by Automation Craft

Same engine, other markets:

Other job and lead data: