JobStreet Scraper: Jobs and Salaries in MY, SG, PH, ID, HK, TH avatar

JobStreet Scraper: Jobs and Salaries in MY, SG, PH, ID, HK, TH

Pricing

from $0.75 / 1,000 jobs

Go to Apify Store
JobStreet Scraper: Jobs and Salaries in MY, SG, PH, ID, HK, TH

JobStreet Scraper: Jobs and Salaries in MY, SG, PH, ID, HK, TH

Scrape JobStreet (Malaysia, Singapore, Philippines, Indonesia) and JobsDB (Hong Kong, Thailand) jobs by keyword and location: title, company, location, salary with parsed range, work type, remote or hybrid, listing date, classification and link, plus optional full description. No login.

Pricing

from $0.75 / 1,000 jobs

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

9 days ago

Last modified

Share

600 JobStreet jobs from Malaysia and the Philippines in 23 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

Why choose this actor?

  • Six country sites in one actor. JobStreet Malaysia, Singapore, Philippines and Indonesia, and JobsDB Hong Kong and Thailand, all on the same input. Our final test run returned 600 of 600 jobs from Malaysia and the Philippines in 23 seconds, and a second run read 80 jobs with full descriptions from the other four sites.
  • Salary you can sort and filter. Besides the salary text exactly as the job shows it, every row with an amount gets salary_min, salary_max, the ISO currency and the pay period. In our test run 285 of the 286 salary labels that contained a number were read into numbers; the one left out was a perk ("Day 1 HMO"), not pay.
  • No login, no cookies, no proxy to set up, and you only pay for jobs you receive. The actor reads the same public job search the sites show to anyone. A refused page, a search with no results and a job already delivered for another keyword in the same run are never charged.

Run it on Apify

Part of The Mine Works Jobs and hiring family: Foundit Monster India Jobs, Hirist Jobs Scraper, India Jobs MCP, Naukri Jobs Scraper, Shine.com Jobs Scraper, Internshala Scraper.

Try it in one minute

Paste this into the input (JSON view) and press Start. It returns 20 software engineer jobs from JobStreet Malaysia in a few seconds:

{
"keywords": ["software engineer"],
"countries": ["my"],
"maxJobs": 20
}

keywords takes job titles or skills, one per line; each keyword is searched on each country site in countries (my, sg, ph, id, hk, th). An empty keywords list returns every job that matches the other filters. location takes a city, state or area as you would type it on the site, such as Kuala Lumpur, Makati or Bangkok.

On Apify's free plan every run returns the first 10 results as a preview, so you can check the data and the fields before you pay. A paid Apify plan returns every result: https://apify.com/pricing?fpr=ymnoit

Copy to your AI assistant

themineworks/jobstreet-jobs-scraper on Apify. Scrapes job listings from JobStreet Malaysia, Singapore, Philippines and Indonesia and JobsDB Hong Kong and Thailand, one row per job with title, company, location, salary text plus parsed min, max, currency and period, work type, on-site/hybrid/remote, listing date, category and link, with optional full description. Call ApifyClient("TOKEN").actor("themineworks/jobstreet-jobs-scraper").call(run_input={"keywords": ["software engineer"], "countries": ["my", "sg"], "maxJobs": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: none (defaults: keywords ["software engineer"], countries ["my"]). Optional: keywords (list; empty list = all jobs), countries (my, sg, ph, id, hk, th), location (text), datePosted ("1", "3", "7", "14" or "31" days), workType ("full-time", "part-time", "contract-temp", "casual-vacation"), workArrangement ("on-site", "hybrid", "remote"), salaryMin and salaryMax (local currency), salaryPeriod ("monthly", "annual", "hourly"; default "monthly"), sortBy ("relevance" or "date"), maxJobs (default 100, 20 to 5000 per keyword per country), includeDescription (default false). Full spec: GET https://api.apify.com/v2/acts/themineworks~jobstreet-jobs-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • 31 fields per job, 6 more with descriptions: title, company, advertiser id, location and region, country, salary text with parsed minimum, maximum, currency and period, work type, on-site/hybrid/remote, category and sub category with ids, listing date and age, short description, the employer's selling points, badges such as "Urgently hiring", logo, link, and the keyword and rank that found it.
  • Full description on demand: switch on includeDescription for the complete job description as plain text and HTML, the closing date, the job status, the employer's screening questions and whether the site verified the advertiser.
  • Every filter the sites offer: location, date posted (24 hours to 31 days), work type, on-site/hybrid/remote, salary range per month, year or hour, and best match or newest first.
  • From 20 to 5,000 jobs per search, 100 per page, every page reachable (we read page 56 of a 5,544 job search). Each keyword on each country site is its own search; three run at a time.
  • No double charging across keywords: a job found by two keywords or on a second page is delivered once.
  • A run summary you can audit: the OUTPUT record lists every search's status, total jobs on the site, pages read, attempts and duplicates, and the success rate per site.

How to use it

Basic: one keyword on one site

{
"keywords": ["accountant"],
"countries": ["sg"],
"maxJobs": 100
}

Several keywords on several country sites

Each keyword runs on each site: this input is 4 searches of up to 150 jobs, 600 jobs in all (our final test run, 23 seconds):

{
"keywords": ["accountant", "data analyst"],
"countries": ["my", "ph"],
"maxJobs": 150
}

Job: daily new job alerts

Newest first, listed in the last 24 hours, one city. Save it as a task and add a daily schedule (Console > Schedules); each run returns the day's new listings.

{
"keywords": ["nurse"],
"countries": ["sg"],
"datePosted": "1",
"sortBy": "date",
"maxJobs": 200
}

Job: salary benchmarking across Southeast Asia

The same role on all six sites, with salary_min, salary_max, salary_currency and salary_period ready to compare. About half of the jobs on these sites show pay (49% in our test run).

{
"keywords": ["data analyst"],
"countries": ["my", "sg", "ph", "id", "hk", "th"],
"maxJobs": 300
}

Job: remote roles with full descriptions for a job board

Remote only, full time, with the complete description, closing date and screening questions:

{
"keywords": ["customer support", "virtual assistant"],
"countries": ["ph"],
"workArrangement": "remote",
"workType": "full-time",
"includeDescription": true,
"maxJobs": 100
}

Job: hiring activity in one city

Leave keywords empty to get every job in an area, then count by company_name or classification to see who is hiring:

{
"keywords": [],
"countries": ["my"],
"location": "Penang",
"datePosted": "7",
"maxJobs": 1000
}

Input parameters

ParameterTypeDefaultWhat it does
keywordsarray of strings["software engineer"]Job titles or skills, one per line. Each is its own search on every site chosen. An empty list returns all jobs that match the other filters.
countriesarray["my"]Country sites: my (my.jobstreet.com), sg (sg.jobstreet.com), ph (ph.jobstreet.com), id (id.jobstreet.com), hk (hk.jobsdb.com), th (th.jobsdb.com).
locationstringemptyA city, state or area as typed on the site. Applies to every site chosen; empty means the whole country.
datePostedstringany1, 3, 7, 14 or 31: jobs listed within that many days.
workTypestringanyfull-time, part-time, contract-temp or casual-vacation.
workArrangementstringanyon-site, hybrid or remote.
salaryMinintegernoneMinimum pay in the site's currency, per salaryPeriod. Applied by the site.
salaryMaxintegernoneMaximum pay, same currency and period.
salaryPeriodstringmonthlymonthly, annual or hourly: what the salary filter amounts mean.
sortBystringrelevancerelevance (best match) or date (newest first).
maxJobsinteger100Upper limit per search (one keyword on one site), 20 to 5,000. The sites serve 100 jobs a page.
includeDescriptionbooleanfalseAdds the full description, closing date, status, screening questions and advertiser verification. One extra request per job.

What data do you get?

One row per job. A job found by two keywords, or on two pages, is delivered once.

The job: job_id, title, company_name, advertiser_id, work_type, work_arrangement, classification, classification_id, subclassification, subclassification_id, listing_date, listing_date_display, teaser, bullet_points, tags, company_logo_url, job_url.

Where: location, region, country_code, country, site.

Pay: salary_text (exactly as shown), salary_min, salary_max, salary_currency, salary_period (hour, day, week, month or year).

With includeDescription: description (plain text), description_html, job_status, expires_at, advertiser_verified, screening_questions, and description_error on the rare row whose details could not be read.

The search: search_keyword, search_location, search_rank, scraped_at.

How full the fields were in our final test runs (600 jobs from Malaysia and the Philippines; descriptions from 80 jobs in Singapore, Hong Kong, Indonesia and Thailand):

FieldFilledWhy not always
job_id, title, company_name, location, work_type, work_arrangement, classification, listing_date, teaser, job_url100%
advertiser_id96%A few private advertisers have none.
company_logo_url82%Not every employer uploads a logo.
region76%Only when the site gives a two level location (city and state).
bullet_points52%Only when the employer added selling points.
salary_text49%About half of employers hide their pay.
salary_min, salary_max, salary_currency47% to 48%Labels without an amount ("Negotiable", "Market Aligned") have none.
salary_period44%Only when the label says per hour, month or year.
tags20%Badges such as "Urgently hiring" or "Expiring soon".
description, description_html, job_status, expires_at100% of 80With includeDescription on.
screening_questions48% of 80Only when the employer set questions.

Stable fields for automations

These fields were present in every row of our test runs and their names will not change:

FieldMeaning
job_idJob id on JobStreet or JobsDB, the same on every site
titleJob title
company_nameHiring company or recruiter as shown
locationLocation as shown, for example Petaling Jaya, Selangor
country_codeMY, SG, PH, ID, HK or TH
siteSite the job was found on, for example my.jobstreet.com
work_typeFull time, Part time, Contract/Temp or Casual/Vacation
work_arrangementOn-site, Hybrid or Remote
classificationJob category, for example Accounting
listing_dateWhen the job was listed, ISO 8601 UTC
teaserShort description from the search results
job_urlLink to the job page
search_rankPosition of the job in its search
scraped_atWhen the job was read, ISO 8601 UTC

Output examples

Real rows from our test runs on 5 October 2026; the long description is trimmed.

JobStreet Malaysia, salary read into numbers:

{
"job_id": "94955829",
"title": "Accountant",
"company_name": "Panthera Corporation",
"advertiser_id": "62457017",
"location": "Petaling Jaya, Selangor",
"region": "Selangor",
"country_code": "MY",
"country": "Malaysia",
"site": "my.jobstreet.com",
"salary_text": "RM 7,500 per month",
"salary_min": 7500,
"salary_max": 7500,
"salary_currency": "MYR",
"salary_period": "month",
"work_type": "Full time",
"work_arrangement": "On-site",
"classification": "Accounting",
"classification_id": "1200",
"subclassification": "Financial Accounting & Reporting",
"subclassification_id": "6151",
"listing_date": "2026-10-02T09:27:00Z",
"listing_date_display": "3d ago",
"teaser": "The Accountant will help coordinate, administer, and support activities that are critical to the functioning of the Panthera Malaysia team.",
"company_logo_url": "https://bx-branding-gateway.cloud.seek.com.au/5b939989-99c9-440b-a633-65b49253ce45.1/jdpLogo",
"job_url": "https://my.jobstreet.com/job/94955829",
"search_keyword": "accountant",
"search_rank": 44,
"scraped_at": "2026-10-05T18:05:56.303Z"
}

JobStreet Philippines, a remote job with selling points and a badge (pay not shown by the employer):

{
"job_id": "94572139",
"title": "Senior Staff Accountant | WFH (A-SVA)",
"company_name": "Sourcefit",
"advertiser_id": "60275551",
"location": "Eastwood, Metro Manila",
"region": "Metro Manila",
"country_code": "PH",
"country": "Philippines",
"site": "ph.jobstreet.com",
"work_type": "Full time",
"work_arrangement": "Remote",
"classification": "Accounting",
"classification_id": "1200",
"subclassification": "Financial Accounting & Reporting",
"subclassification_id": "6151",
"listing_date": "2026-09-11T04:57:32Z",
"listing_date_display": "24d ago",
"teaser": "Senior Staff Accountant to oversee accounting functions including financial reporting, general ledger, and month-end closing.",
"bullet_points": ["Work from home Set Up", "Competitive Salary", "HMO Benefit"],
"tags": ["Expiring soon"],
"company_logo_url": "https://bx-branding-gateway.cloud.seek.com.au/a009e466-1469-4e9c-bfd2-d416453d7ac5.1/jdpLogo",
"job_url": "https://ph.jobstreet.com/job/94572139",
"search_keyword": "accountant",
"search_rank": 78,
"scraped_at": "2026-10-05T18:05:56.701Z"
}

JobStreet Singapore with includeDescription on (description trimmed here; the row holds all of it):

{
"job_id": "95063436",
"title": "Associate Engineer ( Enterprise & Digital Solutions)",
"company_name": "NetLink Trust",
"advertiser_id": "60183816",
"location": "Bedok, East Region",
"region": "East Region",
"country_code": "SG",
"country": "Singapore",
"site": "sg.jobstreet.com",
"work_type": "Full time",
"work_arrangement": "On-site",
"classification": "Information & Communication Technology",
"classification_id": "6281",
"subclassification": "Database Development & Administration",
"subclassification_id": "6286",
"listing_date": "2026-10-05T10:06:17Z",
"listing_date_display": "8h ago",
"teaser": "Responsible for supporting enterprise and digital solutions used by internal and external customers.",
"bullet_points": ["Motivated and Supportive Workforce", "Training & Development Opportunity", "Workforce Diversity"],
"company_logo_url": "https://bx-branding-gateway.cloud.seek.com.au/9b300de5-eb91-4e19-86a5-d2390ab09c2d.1/jdpLogo",
"job_url": "https://sg.jobstreet.com/job/95063436",
"search_keyword": "data analyst",
"search_rank": 17,
"scraped_at": "2026-10-05T18:06:19.966Z",
"description": "The Associate Engineer is responsible for supporting enterprise and digital solutions used by internal and external customers.\nResponsibilities:\n1. Enterprise & Digital Solutions Support:\n\n• Provide ongoing production and change request support for enterprise and digital applications (e.g. Helix, Service Web Portal, B2B, Order Service & Management, SharePoint, Qlik, etc.) and their associated interfaces with ERP/S2C and OSS/BSS applications. ...",
"description_html": "<p>The Associate Engineer is responsible for supporting enterprise and digital solutions used by internal and external customers.</p> ...",
"job_status": "Active",
"expires_at": "2026-11-04T12:59:59.999Z",
"advertiser_verified": true,
"screening_questions": [
"Which of the following statements best describes your right to work in Singapore?",
"What's your expected monthly basic salary?",
"Which of the following types of qualifications do you have?",
"How many years' experience do you have using SQL queries?"
]
}

Pricing

Pay per event: you pay for the job rows you receive, plus a flat $0.005 per run, whatever memory you choose.

EventWhen it is chargedFree planBronze (Starter)Silver (Scale)Gold (Business)
job-scrapedOnce per job row stored in your dataset$0.75 per 1,000$0.75 per 1,000$0.75 per 1,000$0.75 per 1,000
run-startOnce per run, when it starts$0.005$0.005$0.005$0.005

The price per single job is the price per 1,000 divided by 1,000. A job with the full description costs the same as one without.

Free plan runs return up to 10 results each; paid plans have no cap.

Never charged:

  • search pages the sites refused, and searches the run could not read;
  • searches with no results;
  • a job already delivered earlier in the same run (found by another keyword, or on another site's search);
  • the info row at the end of a run;
  • anything past your "Max cost per run": the actor stops delivering when your limit is reached instead of sending rows for free.

FAQ

What exactly does this actor read?

The public job search of JobStreet (my.jobstreet.com, sg.jobstreet.com, ph.jobstreet.com, id.jobstreet.com) and JobsDB (hk.jobsdb.com, th.jobsdb.com), which all run on the SEEK platform. It reads the same search results the sites show to anyone without signing in, and, with includeDescription, the same job details a job page shows.

How many jobs can I get?

Up to 5,000 per search (one keyword on one site), 100 per page. Every page of a search is reachable: in our tests we read page 56 of a 5,544 job search. For more, add keywords or sites; each is its own search of up to 5,000.

What do I get on the free plan?

Every run on Apify's free plan returns the first 10 results, so you can check the data and the fields before you pay. A paid Apify plan returns every result, up to the limit you set.

How long does a run take?

Without descriptions, one request brings up to 100 jobs: 600 jobs from 4 searches on 2 sites took 23 seconds in our final test. With descriptions each job needs one more request: 80 jobs took 23 to 55 seconds in our tests, eight read at a time per search.

How fresh is the data?

Every run reads the sites live. listing_date is when the employer listed the job; use datePosted and sortBy: "date" for new jobs only, and a schedule for daily runs.

How is the salary read?

salary_text is the label exactly as the job shows it. When it holds an amount, the actor fills salary_min and salary_max (equal for a single figure, only salary_max for "up to"), salary_currency (from the label or the site: RM is MYR, ฿ is THB, Rp is IDR, a plain $ is SGD in Singapore, HKD in Hong Kong and USD on the other sites, unless the site marks the currency) and salary_period when the label says per hour, month or year. Thousands written with dots (Rp 5.500.000) and "k" amounts ($70k, 40-50k) are read correctly. Labels without an amount give only salary_text.

How wide is a location?

The site decides. location is passed to the site's own search, which also returns nearby areas: a search for Makati returns Metro Manila listings and remote jobs too, as it does on the site. location, region and country_code on each row tell you where each job really is.

Do I need an account, cookies or a proxy?

No account, no cookies and nothing to set up. The actor reads the sites' public search and job details data over Apify's datacenter proxy. The job pages themselves are behind a bot check for datacenter visitors; the actor does not open them and does not need them. In our tests every search page and every job details request was answered, with no bot check.

What if a job is taken down while the run reads it?

The row is still delivered with everything from the search, and description_error says the details could not be read. In our test runs all 80 of 80 descriptions were read.

Can I monitor new jobs over time?

Yes. Save the input as a task with datePosted: "1" and sortBy: "date", add a daily schedule, and use job_id to keep only jobs you have not seen.

Which formats can I download?

JSON, CSV, Excel, XML, RSS and an HTML table, from the run's dataset in Console or through the API.

Can I use it from Claude, ChatGPT or Cursor (MCP)?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/jobstreet-jobs-scraper
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http jobstreet-jobs-scraper "https://mcp.apify.com/?tools=themineworks/jobstreet-jobs-scraper"

The actor only reads job listings that the sites show publicly to anyone without signing in, and it never asks for the recruiter phone or contact fields the sites keep. Some descriptions name a contact person; you are responsible for how you use the data, for the sites' terms, and for data protection law such as GDPR, CCPA and the local laws of the countries involved (Malaysia's PDPA, Singapore's PDPA, the Philippines' Data Privacy Act). If in doubt, ask a lawyer about your use case.

Integrations

  • Google Sheets: send each run's rows to a sheet with Apify's Google Sheets integration, or import the CSV link of the dataset.
  • Make, Zapier and n8n: start the actor and read its dataset with the Apify apps and nodes, for example "new remote jobs to Slack".
  • Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
  • API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
  • MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

More from The Mine Works

Jobs and hiring

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Company and business data

E-commerce and marketplaces

Food and local services

Developer and AI tools

More tools

Support

Found a search that should return jobs and does not? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For another job site, a new source or a field you need, email dmineworks@gmail.com.

Search JobStreet and JobsDB in six countries by keyword, location, date, work type and salary, and get every job back as a clean row with its pay read into numbers.