JobStreet Southeast Asia Job Search by Keyword & Country
Pricing
from $0.49 / 1,000 results
JobStreet Southeast Asia Job Search by Keyword & Country
Search JobStreet across Singapore, Malaysia, the Philippines, Indonesia and Thailand by keyword or country, with salary, job type and a direct apply link on every job.
Pricing
from $0.49 / 1,000 results
Rating
0.0
(0)
Developer
vexaloom-labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
JobStreet & JobsDB Scraper: Jobs, Companies, Salaries
Scrape JobStreet and JobsDB across six Southeast Asian markets — Malaysia, Singapore, Indonesia, the Philippines, Thailand and Hong Kong. Get full job ads with parsed salary ranges and applicant demand, company profiles with employee reviews, and role salary benchmarks, all without a login.
What this actor does
- Five modes: keyword search, scrape job / search / company URLs, company jobs, company profiles, and role salary benchmarks.
- Full job ads: description text or HTML, bullet points, screening questions, work type, work arrangement, classification, expiry date and apply link.
- Structured salaries: parsed minimum, maximum, currency and period from the posted salary label, plus a strict salary filter.
- Applicant demand: applicant count, application volume and resume / cover-letter percentages when the employer publishes them.
- Company intelligence: rating, review count, industry, size, website, perks, employee reviews, open jobs and salary ranges by role.
- Incremental runs: emit only new or changed jobs between scheduled runs, with NEW / UPDATED / REAPPEARED / EXPIRED change types.
- Clean output: fields the source does not show are omitted;
falseand0are kept.
Services (modes)
| Mode | What it returns |
|---|---|
searchJobs | Job records from one or more keywords and locations, with server-side category, work type, arrangement, date and sort filters plus strict client-side salary, keyword and applicant filters. |
byUrls | Job records from job URLs, job records from search URLs, and company records from company URLs. Each URL's own market is used. |
companyJobs | Open job records for one or more companies, found by company URL, numeric id or name. |
companyProfiles | One company record per company, with optional reviews, salary ranges by role and current open jobs. |
salaryBenchmarks | One record per role with typical monthly salary, growth, job satisfaction and classification, plus optional role details and state / city salary breakdowns. |
How it works
The actor reads the same public listings the JobStreet and JobsDB sites show, using each market's own host, language and currency. Full job descriptions, company profiles, reviews and salary benchmarks come from the sites' public listing data rather than rendered pages, so results are consistent and fast. No account, cookie or proxy setup is required. Vietnam is not included because JobStreet Vietnam now redirects to Jora; Thailand is served by JobsDB at th.jobsdb.com.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | searchJobs | One of the five modes above. |
keywords | string | – | Job titles or keywords, one per line (mode=searchJobs). A small default search is used when empty. |
locations | string | – | Cities or regions, one per line; combined with each keyword (mode=searchJobs). |
country | string | sg | my, sg, id, ph, th or hk. |
classification | string | – | Job category id (mode=searchJobs). |
subClassification | string | – | Sub-category id; can be combined with classification (mode=searchJobs). |
workType | string | – | 242 full time, 243 part time, 244 contract/temp, 245 casual/vacation. |
workArrangement | string | – | 1 on-site, 2 hybrid, 3 remote. |
dateRange | string | – | 1, 3, 7, 14 or 31 days. |
listedAfter | string | – | Keep jobs listed on or after YYYY-MM-DD. |
listedBefore | string | – | Keep jobs listed on or before YYYY-MM-DD. |
salaryMin | integer | – | Drop jobs whose salary is entirely below this amount. |
salaryMax | integer | – | Drop jobs whose salary is entirely above this amount. |
salaryType | string | monthly | monthly, annual or hourly; the unit for the salary bounds. |
sortBy | string | relevance | relevance or date. |
startUrls | string | – | Job, search or company URLs, one per line (mode=byUrls). |
companies | string | – | Company URLs, numeric ids or names, one per line (mode=companyJobs / companyProfiles). |
includeDetails | boolean | true | Fetch the full description, salary, applicant demand and company snapshot. |
descriptionFormat | string | text | text, html or both. |
includeApplicantInsights | boolean | true | Add applicant count, volume and resume / cover-letter percentages. |
includeCompanyProfile | boolean | true | Add the company rating, industry, size, website and description to each job. |
includeReviews | boolean | false | Fetch employee reviews (mode=companyProfiles). |
maxReviewsPerCompany | integer | 10 | Review cap per company (1–100). |
includeCompanySalaries | boolean | false | Fetch company salary ranges by role. |
includeOpenJobs | boolean | true | Attach current open jobs (mode=companyProfiles). |
maxOpenJobs | integer | 20 | Open-jobs cap per company (1–100). |
roles | string | – | Role titles or queries to benchmark, one per line (mode=salaryBenchmarks). A default accounting role is used when empty. |
includeRegionalSalaries | boolean | false | Add state and city salary breakdowns. |
includeRoleDetails | boolean | false | Add role summary, tasks, skills, growth, review statistics and similar roles. |
includeKeywords | string | – | Keep jobs whose title, company or description contains at least one term, one per line. |
excludeKeywords | string | – | Drop jobs whose title, company or description contains any term, one per line. |
minApplicants | integer | – | Drop jobs below this applicant count (requires details). |
maxApplicants | integer | – | Drop jobs above this applicant count (requires details). |
language | string | en | en, id, th or zh; used where the market supports it. |
compact | boolean | false | Keep only core job fields for lightweight feeds. |
maxItems | integer | 50 | Hard cap on records (1–5000). |
maxPages | integer | 10 | Page cap per keyword/location (100 jobs per page). |
incrementalMode | boolean | false | Emit only new or changed jobs (job modes). |
stateKey | string | – | Name for saved incremental state; reuse it on each scheduled run. |
emitUnchanged | boolean | false | Also emit jobs whose content has not changed. |
emitExpired | boolean | false | Emit jobs that were seen before but have disappeared. |
Output per job (recordType="job")
Identity and links: jobId, title, jobUrl, applyUrl, recordType, scrapedAt.
Company: company, companyId, companyUrl, companyLogoUrl, advertiserName, advertiserId, advertiserVerified, companyRating, companyReviewCount, companyIndustry, companySize, companyWebsite, companyDescription, companyPerks.
Location: location, locationCountry, locationCountryCode, locationState, locationRegion, locationSuburb, locationPostcode, country.
Classification and work: classification, classificationId, subClassification, subClassificationId, roleId, normalizedRoleTitle, jobType, workTypes, workArrangement, badges.
Dates and content: postedDate, listedAt, listedAtDisplay, expiresAt, isExpired, teaser, descriptionText, descriptionHtml, bulletPoints, screeningQuestions.
Salary: salary (the posted label, only when it is a real salary), salaryMin, salaryMax, salaryCurrency, salaryPeriod.
Demand and status: applicantCount, applicantCountLabel, applicantVolumeLabel, resumePercentage, coverLetterPercentage, isLinkOut, isSponsored, adType.
Incremental mode adds changeType, firstSeenAt and lastSeenAt.
Output per company (recordType="company")
companyId, name, url, logoUrl, coverImageUrl, isClaimed, country, countryCode, industry, size, website, description, specialities, rating, reviewCount, recommendedPercent, ratingBreakdown, categoryRatings, perks, awards, aiSummary, reviewLocations, openJobsCount, openJobs, reviewTotal, reviews, salaryRanges, salaryUpdatedAt, recordType, scrapedAt.
Output per salary benchmark (recordType="salaryBenchmark")
roleId, alias, title, url, salaryMin, salaryMax, salaryMedian, salaryCurrency, salaryPeriod, growth, growthPercent, growthYears, jobSatisfaction, classifications, imageUrl, country, summary, tasksAndDuties, skills, reviewStats, similarRoles, locations, salaryLocation, recordType, scrapedAt.
Examples
Search accounting jobs in Kuala Lumpur
{"mode": "searchJobs","keywords": "accountant\nfinance executive","locations": "Kuala Lumpur","country": "my","classification": "1200","dateRange": "7","salaryMin": 3000,"salaryMax": 6000,"salaryType": "monthly","includeDetails": true,"maxItems": 100}
Scrape pasted job and company URLs
{"mode": "byUrls","startUrls": "https://sg.jobstreet.com/job/95541255\nhttps://my.jobstreet.com/companies/mosca-168555693395725","includeReviews": true,"maxReviewsPerCompany": 10,"maxItems": 20}
Company profiles with reviews and open jobs
{"mode": "companyProfiles","companies": "Marina Bay Sands\nhttps://sg.jobstreet.com/companies/marina-bay-sands-168557908899025","country": "sg","includeReviews": true,"maxReviewsPerCompany": 30,"includeCompanySalaries": true,"includeOpenJobs": true,"maxOpenJobs": 25}
Role salary benchmarks with regional detail
{"mode": "salaryBenchmarks","roles": "data analyst\naccountant","country": "my","includeRoleDetails": true,"includeRegionalSalaries": true,"maxItems": 10}
Use cases
- Recruitment market research: compare demand, salaries and work arrangements across six Southeast Asian markets.
- Compensation benchmarking: collect posted salary ranges and official role salary guides in local currencies.
- Job feed aggregation: power a regional job board with full descriptions, expiry dates and apply links.
- Talent sourcing: find companies hiring for a role and pull their profile, reviews and open jobs.
- Competitive intelligence: track which employers are hiring, how often roles are refreshed and what they pay.
- AI and MCP pipelines: use compact output for lightweight, structured job feeds.
Usage cost
The actor does not add a separate per-item fee of its own; you pay for the Apify platform compute your run uses. A search run with full details costs roughly one listing request plus one detail request per returned job, so maxItems is the main cost control. A small scheduled run with 3–50 jobs is inexpensive; large runs with thousands of jobs and company reviews cost more. Use compact and includeDetails=false for high-volume monitoring.
FAQ
Which countries are covered? Malaysia, Singapore, Indonesia, the Philippines (JobStreet) plus Thailand and Hong Kong (JobsDB). Vietnam is no longer a JobStreet market and redirects to Jora, so it is not offered.
Do I need a JobStreet account or cookies? No. The actor reads public listings and public company data without a login, cookie or proxy.
Why is salary missing on some jobs? Many employers do not publish a salary. When the posted label contains no real salary — for example "Weekends Off, Remote" — the salary fields are omitted rather than guessed.
How does the salary filter work when the site's own filter is inexact? The actor parses each job's salary and keeps only jobs whose advertised range overlaps your minimum and maximum. Jobs without a published salary are excluded when a salary bound is set. Salary values are converted between monthly, annual and hourly for the comparison.
Can one run search several markets?
Each run uses one country, or the market of each URL in byUrls. Run once per market if you need a combined dataset.
How complete are company reviews and salary ranges? They are returned when the employer has claimed a company profile and has published reviews or salary data. Jobs without a profile still return the job fields; the company enrichment is simply omitted.
What is the difference between companyJobs and companyProfiles?
companyJobs returns individual open jobs for the companies you supply. companyProfiles returns one record per company with optional reviews, salary ranges and a list of open jobs.
How does incremental mode decide a job changed?
It compares title, company, location, salary, description, applicant count and expiry between runs. New jobs are NEW, changed jobs UPDATED, returning jobs REAPPEARED, and disappeared jobs EXPIRED when enabled. Around 50,000 job ids are remembered per state key.
Is this affiliated with JobStreet or JobsDB? No. This actor reads public listings and is not affiliated with, endorsed by, or sponsored by JobStreet, JobsDB or SEEK.
Notes
- Empty fields are omitted at every level;
falseand0are preserved. - Dates are ISO 8601 in UTC;
postedDateis aYYYY-MM-DDdate. - Salary amounts are emitted in the market's currency unless the label names another currency.
- Company URLs and job URLs always point at the canonical market host.
- Private-advertiser jobs keep the site's "Private Advertiser" company label; company profile fields are omitted when no profile exists.
byUrlsaccepts job links, search links and company links, including legacy JobStreet and JobsDB domains; a page number in a search link is honoured.- A company list with several companies is interleaved, so
maxItemscovers every company instead of stopping at the first one. - The default daily run is one small Singapore search with three jobs and full details.
Limitations
- Company coverage is conditional. Not every employer has a claimed profile, rating, reviews or salary ranges. Fields are omitted when absent.
- Salary labels vary. The parser handles ranges, single figures,
k, "Up to", monthly/annual/hourly periods, and Malaysian, Singaporean, Indonesian, Philippine, Thai and Hong Kong formats. Unusual or malformed labels may be omitted. - Search results change constantly. The same query can return a different order or new jobs between runs; use incremental mode and a stable
stateKeyfor scheduled monitoring. - Listing depth follows the site's own result count. Pages are 100 jobs each and stop at the source's total; very broad queries can return many pages.
- No HTML fallback. The actor relies on the public listing data the sites expose; if a market changes that data, the affected fields are omitted and the run status reports the failure.
- No built-in notifications. Use Apify schedules and integrations to act on new or changed jobs.
- Review data is employer-published. Reviews can be old, sparse or absent for smaller companies.