JobStreet & JobsDB Jobs Scraper (Asia) avatar

JobStreet & JobsDB Jobs Scraper (Asia)

Pricing

from $1.05 / 1,000 jobs

Go to Apify Store
JobStreet & JobsDB Jobs Scraper (Asia)

JobStreet & JobsDB Jobs Scraper (Asia)

Scrape JobStreet (Malaysia, Singapore, Philippines, Indonesia) and JobsDB (Hong Kong, Thailand) jobs: title, company, location, salary text, dates, optional full ad. Reads every list version it finds across visitors, not just one. Pay per job.

Pricing

from $1.05 / 1,000 jobs

Rating

0.0

(0)

Developer

Hexagone Data

Hexagone Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Categories

Security

Limited permissions

Share

Scrape job offers from JobStreet (Malaysia, Singapore, Philippines, Indonesia) and JobsDB (Hong Kong, Thailand), six country sites in one Actor. Paste the search results URL your browser shows, filters included, or a job URL, and get one record per job: title, advertiser, location, classification and sub-classification, work type, work arrangement, salary text as shown, listing date, card tags and selling points. Turn on includeDetails to also get the full ad, its status and expiry, the apply type, the employer questions, contacts found in the ad and the company profile, at no extra charge.

What makes it different:

  • Every version of the list it can find. The site shows different lists to different visitors. For the same search, measured on 2026-11-02: midwife in Malaysia gave 69 or 95 jobs depending on the visitor, 122 together; pharmacist in Malaysia 542 or 643, 724 together; pharmacist in Hong Kong 129 or 216, 229 together. A scraper that reads one visitor gets one of these lists, by chance. This Actor checks 9 other visitors and reads every version it finds, each job delivered once. Some of the extra jobs are looser matches: the site widens its own results. The field listVersion tells you which version brought each job, and you can turn this off. Not every search has versions: none measured in Thailand (10 searches) nor on searches without a keyword.
  • Whole lists, no 550-result limit on these sites. Measured: 16,249 distinct jobs of 16,249 for engineer in Malaysia. The run compares the distinct jobs of each version with the total the site announced. Any gap is reported with both numbers.
  • URLs and filters of all six sites, in English or in the site's own language (/th/, /id/, /zh/).
  • No browser, no residential proxy: the site's own search and job details APIs, through the Apify datacenter proxy.

Try it with 20 jobs

  1. Keep the prefilled start URL (https://my.jobstreet.com/nurse-jobs/in-Kuala-Lumpur) and Maximum number of jobs = 20.
  2. Click Start. You pay for 20 jobs: $0.035 (details included, start fee included).
  3. Open Jobs overview for the table, Run summary for what was collected and why anything is missing.

What to paste

You pasteExampleWhat you get
A keyword searchhttps://my.jobstreet.com/nurse-jobs/in-Kuala-Lumpurevery job of the search
A classification searchhttps://id.jobstreet.com/jobs-in-sales/in-Jakartafilters kept exactly as in the URL
A search with filtershttps://sg.jobstreet.com/accountant-jobs/full-time?daterange=7&salaryrange=5000-&salarytype=monthlysame
A remote / hybrid searchhttps://sg.jobstreet.com/software-engineer-jobs/remoteworkarrangement filter
A page in the site's languagehttps://th.jobsdb.com/th/sales-jobs, https://hk.jobsdb.com/zh/accountant-jobstranslated labels, url in that language
A jobhttps://ph.jobstreet.com/job/95631049that job with its details (detailsSource: jobPage)

Supported URL parts: /<keywords>-jobs, /jobs, /jobs-in-<classification>[/<sub-classification>] (the 30 classifications), /<keywords>-jobs-in-<classification>, /in-<location>, /full-time, /part-time, /contract-temp, /casual-vacation, /on-site, /remote, /hybrid, and every query parameter of the site (daterange, salaryrange, salarytype, sortmode, distance, classification, subclassification, workarrangement...). page=, and jobId= when you clicked a job on the page, are ignored: the run reads the whole search. Old domains (www.jobstreet.com.my, www.jobstreet.com.sg, www.jobstreet.com.ph, www.jobstreet.co.id) work. As on the website, an English /sales-jobs means the Sales classification (the site redirects it to /jobs-in-sales), not the keyword; /th/sales-jobs is the keyword, as on the website. A URL the Actor does not understand is rejected with the reason; it is never replaced by a broader search.

No URL? Fill Keyword, Location, Country (MY, SG, PH, ID, HK, TH), Language and the optional filters. URLs win over the keyword fields.

Where: the location is sent as typed and the site decides what it means (Johor Bahru is searched as Johor Bahru Johor, Jakarta Raya as Jakarta); the run summary shows it (whereSearched). A place the site does not know ends no_results with a LOCATION_UNKNOWN warning: it is never replaced by another place.

Output

One record per job and run (jobId is the key: a job found by two of your URLs or two list versions is delivered once). Unknown values are null, never "", 0 or false. Real record, abridged (ad text and questions shortened; read on 2026-11-02). Every field is listed in the dataset schema:

{
"jobId": "95053570",
"url": "https://my.jobstreet.com/job/95053570",
"title": "STAFF NURSE / NURSE AIDE",
"advertiserName": "Little Precious Postnatal Care",
"advertiserId": "60755985",
"companyName": "Little Precious Postnatal Care",
"companyId": "168549543467903",
"location": "Kuala Lumpur",
"countryCode": "MY",
"classification": "Healthcare & Medical",
"classificationId": "1211",
"subClassification": "Nursing - Community, Maternal & Child Health",
"subClassificationId": "6340",
"workTypes": [
"Full time"
],
"workArrangements": [
"On-site"
],
"salaryLabel": "RM 2,500 – RM 3,500 per month",
"teaser": "Assessment of nursing needs for mothers and babies. Advice on breastfeeding, managing new-born and other health promotion to mothers. Monitor...",
"bulletPoints": [
"Meal Allowances + Night Shift Allowances + Overtime",
"Transportation nearby: LRT Abdullah Hukum (5mins walking distance)",
"Friendly working environment, we work as team work together"
],
"postedAt": "2026-10-05T03:55:40Z",
"postedAtLabel": "28d ago",
"tags": [
"Expiring soon"
],
"site": "MY",
"language": "en",
"sourceUrl": "https://my.jobstreet.com/nurse-jobs/in-Kuala-Lumpur",
"position": 6,
"listVersion": 1,
"detailsSource": "jobPage",
"descriptionText": "Assessment of nursing needs for mothers and babies.\nAdvice on breastfeeding, managing new-born and other healt...",
"status": "Active",
"isExpired": false,
"expiresAt": "2026-11-04T12:59:59Z",
"isExternalApply": false,
"questions": [
"What's your expected monthly basic salary?",
"..."
],
"jobPageClassifications": [
"Nursing - Community, Maternal & Child Health (Healthcare & Medical)"
],
"suburb": null,
"state": "Kuala Lumpur",
"country": "Malaysia",
"area": null
}

Good to know:

  • advertiserName is the name the card shows; companyName is the site's normalised company name, not shown on the card, null when the site has none.
  • salaryLabel is the salary text exactly as shown (RM 4,000 – RM 5,000 per month). The site has no structured salary in its answers: no amount is invented.
  • classification and subClassification are the first classification (the one the card shows); classifications lists all.
  • listVersion: 1 = in the list of the run's first visitor; 2 or more = another visitor sees this job, the first one does not.
  • position is the rank in the list of that version as the search API serves it. The order depends on the visitor.
  • language follows the page you pasted. It changes translated labels (work type, location, classification, dates), never the jobs.
  • With includeDetails off, every detail field is null (or []) and detailsSource is listing.

Run summary

Each run writes a readable Run summary (and the same as JSON in OUTPUT): per start URL, the status, jobs delivered vs jobs announced by the site, the list versions read (listVersions), and the reason for anything missing.

StatusMeaning
donein every list version read: distinct jobs seen + jobs the site repeated inside one page reach the jobs announced, and no page failed, came back empty, only repeated earlier jobs or saw the total collapse. One exception, always shown with its numbers: the site served every announced row but its ranking moved while a long list was read, so some jobs were seen twice (at most 1 job or 0.5%, plus the jobs the site added to its total meanwhile; worst measured 38 of 16,318)
partial_collectionsomething is missing: both numbers and the cause; warning PARTIAL_COLLECTION
stopped_at_limityour maxItems or maximum charge was reached
no_resultsthe site announced 0 jobs: the search is empty, the URL is wrong or the site is down (NO_RESULTS warning)
no_new_jobsevery job of this URL was already delivered by an earlier URL
job_not_availablea pasted job id does not exist (the site answers "no job" without error); no job charged
blocked_by_site, rate_limited, network_error, http_error, not_found, site_maintenancethe site refused or did not answer even after new IPs: never reported as an empty search
unrecognized_page, structure_changedthe answer is not a search result the Actor can read; never reported as an empty search
not_processed, interrupted, internal_errorthe URL was not reached or finished (limit reached before it, run stopped, unexpected error)

jobsAnnouncedBySite is the largest total of a version: with several versions, jobsSeen can be higher than it. A few jobs removed while the list is read (measured: 3 of 17,815) are normal; a bigger drop is reported. Codes starting with ANO_ (ANO_ACCES, ANO_CHAMP_VIDE, ANO_ERREUR_INTERNE...) come from the shared run checks: access verdicts, a field suddenly empty, an internal error.

A run where no URL delivers anything fails with the exact cause. Warnings (PARTIAL_COLLECTION, UNEXPECTED_DATA, JOBS_SKIPPED, JOB_EXPIRED, DETAILS_NOT_READ, DETAILS_STOPPED, VISITORS_NOT_CHECKED, LOCATION_UNKNOWN...) are listed under Checks; "Checks passed" is shown only when there is none.

Pricing

Pay per event: $1.50 per 1,000 jobs ($0.0015 per job delivered), details included: the same price with or without includeDetails, and for a pasted job URL. Plus a $0.005 start fee per run (charged by Apify once per GB of memory; the default is 1 GB). Apify subscribers pay less automatically, on every event: 10% off on the Bronze plan, 20% on Silver, 30% on Gold and above.

JobsPrice (with or without details, start fee included)
20$0.035
1,000$1.505

Only jobs written to your dataset are paid. Reading every list version brings more jobs for a search, so a search with no maxItems costs more than one visitor's list: set maxItems, or turn allVersions off, if you want one list only. Your maximum charge per run is respected: the run stops cleanly before the job that would exceed it, and no job details are read for a job that could not be paid.

Known limits

  • The list versions are found by asking 9 other visitors: a version seen by few visitors can be missed (measured: a version seen by 1 visitor in 10 is missed about one run in three), and the run cannot prove there is no other. A visitor counts as another version when its total differs (by more than 2 jobs and 0.5%) or when its first 100 jobs hold one never seen; a version that differs only further down its list, with the same total, is not read. Jobs posted shortly before or while the list is being read do not count as a version: they are seen, counted (jobsPostedDuringRun) and not delivered; run again to get them. At most 6 versions are read per search (2 to 4 measured); more would be reported.
  • maxItems (default 500) stops the run where it is: reached in the first list, no other visitor is checked, and the summary says so.
  • Some jobs of a list are looser matches: the site widens keyword searches on its own, more for some visitors than for others.
  • position differs from the rank on the website, and between visitors: the order is the site's ranking and depends on the visitor.
  • postedAtLabel ("17h ago") is relative to the reading time. Featured ads, multiple locations and multiple classifications per job were never seen in 1,740 jobs read on 2026-11-02: delivered as the site sends them.
  • Not provided: number of applicants (the site shows it to signed-in users only), estimated salary, salary amounts as numbers (the text is delivered as shown).
  • Several work types or arrangements in the keyword fields are sent comma-separated, as the website's filter does.
  • Vietnam is not covered: JobStreet no longer serves it (www.jobstreet.vn redirects elsewhere).
  • Default run timeout: 4 hours (about 1 s per job with details on Apify, measured: 1,191 jobs in 20 minutes; some 14,000 jobs); raise it for larger searches with details.

Support

Questions, a URL that does not work, a field you need: open an issue on the Actor's Issues tab with the run link.

This Actor is not affiliated with, endorsed or sponsored by SEEK Limited, JobStreet or Jobsdb. These names are trademarks of their owners, used here only to describe the websites the data comes from. Only publicly visible job ads are collected; use the data in line with the site's terms and the privacy laws that apply to you (contacts found in ads are personal data).