JobStreet Jobs Scraper — APAC Hiring Data
Pricing
from $5.00 / 1,000 jobstreet job record scrapeds
JobStreet Jobs Scraper — APAC Hiring Data
Search public JobStreet listings in Malaysia, Singapore, Indonesia, and the Philippines. Returns structured jobs, companies, salary, location, work type, dates, and apply URLs for recruiters and hiring research.
Pricing
from $5.00 / 1,000 jobstreet job record scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
17 days ago
Last modified
Categories
Share
What is JobStreet Jobs Scraper — APAC Hiring Data?
JobStreet Jobs Scraper turns a keyword search on JobStreet Malaysia, Singapore, Indonesia or the Philippines into a dataset with one row per public job listing. Each row returns the job ID, title, location, country, salary text with parsed minimum, maximum and pay period when shown, a description, the job URL and the search page it came from, plus the company name when the listing shows one. Recruiters, staffing agencies, compensation analysts, HR-tech builders and AI agents use it to track hiring demand and salary ranges across Southeast Asia.
Why recruiters use this JobStreet scraper
- Four Southeast Asian markets. Choose
MY,SG,IDorPHand search each market's own JobStreet site. - Salary parsed for analysis.
salaryMin,salaryMaxandsalaryPeriodturn advertised ranges into numbers you can chart. - Fresh postings first.
postedWithinDaysandsortByset todatefocus each run on new listings. - Richer text on request.
includeJobDetailsvisits each job page for a fuller description where JobStreet publishes one. - Stable job keys.
jobIdandjobUrlmake deduplication and daily tracking simple.
Best fit for this Actor
- Designed for hiring-market research in Malaysia, Singapore, Indonesia and the Philippines from a role keyword.
- Use it for salary benchmarks, demand tracking by city and recruiter lead lists of companies that are hiring.
- For Hong Kong and Thailand, continue with JobsDB Jobs Scraper — HK & Thailand Hiring Data using the same keywords.
- When your market is Australia or New Zealand, use SEEK Job Scraper — Australia & New Zealand instead.
Example workflow: from a role to a regional salary benchmark
A compensation analyst starts with one role, data analyst. They run the Actor four times with keywords set to data analyst, postedWithinDays set to 14 and country set to MY, SG, ID and PH in turn. The dataset returns title, location, salaryText, salaryMin, salaryMax and salaryPeriod for each listing. They keep rows with parsed salaries, compare the median range per country, export the table to their benchmark deck and schedule the same runs monthly to track movement.
Input
| Field | Type | What it controls |
|---|---|---|
keywords | string | Job search text, for example software engineer or senior data engineer. Required. |
country | string | MY Malaysia, SG Singapore, ID Indonesia or PH Philippines. Default MY. |
location | string | City or region filter, for example Kuala Lumpur. |
postedWithinDays | string | any, 1, 3, 7, 14 or 30. Default 7. |
sortBy | string | date for newest first or relevance. |
maxResults | integer | Job rows to save and bill, 1 to 500. Default 20. |
includeJobDetails | boolean | Visit each job page for fuller text. Default true. |
{"keywords": "data analyst","country": "SG","postedWithinDays": "14","sortBy": "relevance","maxResults": 25,"includeJobDetails": true}
Output
One row per job listing.
| Field | What it contains |
|---|---|
jobId, jobUrl | JobStreet job ID and public job URL |
title | Job title as advertised |
companyName | Advertiser name when the listing shows one |
location, country | City or region and market code |
salaryText | Salary line exactly as JobStreet shows it |
salaryMin, salaryMax, salaryPeriod, salaryCurrency | Parsed salary range when the listing advertises one |
description | Teaser or job-page description |
sourceUrl, scrapedAt | Search page the job came from and collection time |
workType, workArrangement, classification, subClassification, postedAt, postedText, companyUrl | Extra listing attributes, filled when JobStreet exposes them for a job |
{"jobId": "94987557","title": "Application Engineer","companyName": null,"companyUrl": null,"location": "Senai, Johor","country": "MY","salaryText": "RM 3,900 – RM 5,000 per month","salaryCurrency": "MYR","salaryMin": 3900,"salaryMax": 5000,"salaryPeriod": "month","workType": null,"workArrangement": null,"classification": null,"subClassification": null,"description": "Support production activities by providing technical engineering support","jobUrl": "https://my.jobstreet.com/job/94987557","postedAt": null,"postedText": null,"sourceUrl": "https://my.jobstreet.com/software-engineer-jobs?sortmode=ListedDate&daterange=7","scrapedAt": "2026-10-01T01:34:42.627Z"}
Every row carries the job ID, title, location, salary line, description and URLs. Many listings advertise a salary range, which fills the parsed salary fields; others show a sign-in prompt in salaryText instead, so filter on salaryMin for salary analysis. The company name appears when the listing publishes it and can include the advertiser's profile text.
Pricing
This Actor uses Pay per event plus Apify platform usage. You pay one JobStreet job record scraped event per validated job saved to the dataset and one small Actor Start event per run, and Apify platform usage is billed on top. The live Pricing tab on this page shows the current event prices.
Worked example: four country runs with maxResults set to 25 save up to a hundred job rows, so they cost up to that many job events, four start events and the platform usage of those runs.
API example
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~jobstreet-jobs-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": "software engineer", "country": "MY", "location": "Kuala Lumpur", "maxResults": 20}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("khadinakbar/jobstreet-jobs-scraper").call(run_input={"keywords": "data analyst","country": "PH","postedWithinDays": "7","maxResults": 50,})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["title"], job["location"], job.get("salaryMin"), job.get("salaryMax"))
Use with AI agents (MCP)
Connect the Actor to Claude, ChatGPT, Cursor or any MCP client through Apify MCP, then ask:
Find 30 data analyst jobs posted on JobStreet Singapore in the last 14 days and summarize the advertised monthly salary range.
The agent calls the Actor with keywords, country and postedWithinDays, reads rows with get-dataset-items, and uses rows with salaryMin for the summary. jobUrl and scrapedAt give provenance per job, and maxResults bounds cost.
Best results
| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| A role in one market | Set keywords and country | Listings from that JobStreet site |
| A city focus | Add location, for example Kuala Lumpur or Cebu | Jobs in that area |
| Daily monitoring | Use postedWithinDays 1 with sortBy date on a schedule | New jobs each day |
| Salary benchmarks | Filter rows that have salaryMin | Numeric ranges to compare |
| Fast, lighter runs | Set includeJobDetails to false | Teaser text from search results |
| Regional comparison | Run the same keywords for each country | A four-market view |
Builder's note
I built this for people who compare hiring across Southeast Asia, so the country switch covers all four JobStreet sites with one input shape. I designed salary parsing to keep the original salaryText next to the numbers, because JobStreet salary lines vary in format and the source text is the safest reference. I made job-page visits optional, since many monitoring runs only need titles, locations and salary lines.
FAQ
Which countries are covered?
Malaysia, Singapore, Indonesia and the Philippines, selected with country.
Why is a salary field empty?
Some employers keep salary private and JobStreet shows a sign-in prompt instead. Parsed salary fields fill when the listing advertises a range.
Can I search several keywords at once?
Run the Actor once per keyword, or schedule several tasks, each with its own keywords.
Responsible use
This Actor collects public JobStreet listings without logging in. Use the data in line with JobStreet's terms and applicable laws such as Malaysia's PDPA, Singapore's PDPA, Indonesia's PDP Law and the Philippine Data Privacy Act. JobStreet is a trademark of its owner; this independent Actor is not affiliated with or endorsed by JobStreet. For questions or bugs, open a ticket in the Issues tab.