JobsDB Scraper — Thailand & Hong Kong Jobs avatar

JobsDB Scraper — Thailand & Hong Kong Jobs

Pricing

Pay per usage

Go to Apify Store
JobsDB Scraper — Thailand & Hong Kong Jobs

JobsDB Scraper — Thailand & Hong Kong Jobs

Scrape JobsDB job listings from Thailand and Hong Kong. Returns 38 fields per job including the full description and parsed salary. Incremental mode returns only new, updated or expired listings with no speed penalty.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Very Banana

Very Banana

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

JobsDB Scraper

Scrape job listings from JobsDBThailand and Hong Kong.

Returns 38 structured fields per job, including the full job description, parsed salary range, classification and work arrangement. No login, no cookies, no browser automation.

Why this scraper

This Actor
Speed100 jobs with full descriptions in ~10 seconds
DescriptionsIncluded by default — not a paid extra that slows the run
Incremental modeReturns only new / updated / expired jobs, with no speed penalty
CoverageBoth JobsDB sites (TH, HK) from a single input
Output38 fields, consistent camelCase naming

It reads JobsDB's own JSON endpoints instead of rendering pages in a browser, which is why it stays fast even when descriptions are included.

Quick start

{
"keyword": "developer",
"country": "th",
"maxResults": 100
}

That returns 100 developer jobs in Thailand with full descriptions.

Incremental mode — pay only for what changed

Running the same search every day usually means paying for the same jobs again. Turn on incrementalMode and the Actor compares against the previous run and returns only what actually changed:

{
"keyword": "developer",
"country": "th",
"incrementalMode": true,
"stateKey": "th-developer-daily"
}

Every record carries a changeType of new, updated, expired or unchanged. When a job is updated, changedFields tells you exactly what moved — title, salary or description. Unchanged jobs are filtered out unless you set emitUnchanged.

This costs no extra time: the comparison runs on data already fetched.

Input

FieldTypeDescription
keywordstringJob title or keyword, e.g. software developer
countrystringth, hk, sg, id, my, ph
locationstringCity or region filter, e.g. Bangkok
startUrlsarrayDirect JobsDB search URLs
maxResultsintegerMax jobs to return (0 = unlimited)
maxPagesintegerMax search pages to crawl
sortBystringrelevance or date
dateRangestringPosted within 1 / 3 / 7 / 14 / 30 days
workTypestringFull time, part time, contract, casual
salaryMinintegerMinimum advertised salary
includeDescriptionbooleanFull description text and HTML (default true)
incrementalModebooleanOnly changed jobs
stateKeystringIdentifier for incremental comparison
emitUnchangedbooleanAlso return unchanged jobs
proxyConfigurationobjectApify Proxy (required)

Output

Each job is one dataset item with 38 fields.

IdentityjobId, url, applyUrl, sourceCountry Coretitle, company, companyId, companyUrl, teaser, bulletPoints Locationlocation, locationArea, locationCountry Classificationclassification, classificationId, subClassification, subClassificationId EmploymentworkType, workArrangement SalarysalaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod DatespostedAt, postedAtRelative, scrapedAt Contentdescription, descriptionHtml, descriptionLength Change trackingchangeType, contentHash, firstSeenAt, lastSeenAt, changedFields MetaisFeatured, searchQuery, resultPosition

Sample output

{
"jobId": "94083698",
"url": "https://th.jobsdb.com/job/94083698",
"title": "Full Stack Developer – AI & Internal Tools",
"company": "Penzilla",
"location": "Bangkok",
"locationCountry": "TH",
"classification": "Information & Communication Technology",
"workType": "Full time",
"workArrangement": "On-site",
"salaryText": null,
"postedAt": "2026-08-19T12:30:51Z",
"description": "About the role\nDevelop and maintain backend systems...",
"descriptionLength": 1840,
"changeType": "new",
"contentHash": "a1b2c3d4e5f60718"
}

A note on salary: JobsDB advertisers publish a salary on roughly a third of listings. When absent, salaryText is null rather than a guess.

Use it from code

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('verybananadata/jobsdb-scraper').call({
keyword: 'developer',
country: 'th',
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("verybananadata/jobsdb-scraper").call(run_input={
"keyword": "developer",
"country": "th",
"maxResults": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["company"])

Common uses

  • Recruitment market research — track which roles and skills are being hired for in Southeast Asia
  • Salary benchmarking — aggregate salaryMin / salaryMax by classification and location
  • Competitor hiring signals — monitor a company via companyId to see when it expands a team
  • Job board aggregation — feed listings into your own board or newsletter
  • Daily monitoring — incremental mode surfaces only new postings each morning

Supported countries

CodeSite
thth.jobsdb.com — Thailand
hkhk.jobsdb.com — Hong Kong

JobsDB operates in Thailand and Hong Kong. Its former Singapore site now redirects to Jora, and Malaysia and the Philippines moved to JobStreet, so those are out of scope for this Actor.