JobStreet & JobsDB Scraper — MY SG PH ID TH HK Jobs
Pricing
from $2.00 / 1,000 job listings
JobStreet & JobsDB Scraper — MY SG PH ID TH HK Jobs
Scrape job listings from JobStreet (MY/SG/PH/ID) and JobsDB (TH/HK) via the SEEK GraphQL API — title, company, structured salary, location, work type, and full descriptions. HTTP-first, fast, CSV-friendly.
Pricing
from $2.00 / 1,000 job listings
Rating
0.0
(0)
Developer
bootforge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
JobStreet SEA Scraper — Malaysia, Singapore, Philippines, Indonesia, Thailand, Hong Kong
JobStreet SEA Scraper is an Apify actor that extracts job listings from JobStreet (Malaysia, Singapore, Philippines, Indonesia) and JobsDB (Thailand, Hong Kong) via the same SEEK GraphQL API the sites' own frontend uses — no HTML scraping, no browser required. It returns title, company, structured salary (min, max, currency, period), location, work type, and — optionally — the full job description.
Use it to build a job-market dashboard, feed an ATS/lead pipeline, benchmark SEA salaries by role and country, or track competitor hiring across six Southeast Asian job markets — exported to JSON, CSV, or Excel.
Table of contents
- What the JobStreet SEA scraper does
- How to scrape JobStreet job listings
- JobStreet scraper input
- JobStreet job data output
- Pricing
- Do I need a proxy for JobStreet?
- Why this JobStreet scraper
- FAQ
- Rate this actor
- Related actors
What the JobStreet SEA scraper does
- 🌏 Six SEA countries, one actor — Malaysia, Singapore, Philippines, Indonesia (JobStreet brand) plus Thailand and Hong Kong (JobsDB brand), all on the shared SEEK GraphQL API.
- 💰 Structured salary —
salary_min,salary_max,salary_currency(MYR/SGD/PHP/IDR/THB/HKD), andsalary_period(yearly/monthly/weekly/daily/hourly), parsed from the raw label — not left as a free-text string. - 🔎 Keyword + filters — search by keywords, location, work type, date posted, and minimum salary.
- 📄 Full descriptions on demand — optional per-job detail fetch (
fetch_detail) for the complete description in text and HTML, plus work arrangement and classification. - ⚡ HTTP-only, no anti-bot browser tier — the GraphQL endpoint answers from a plain datacenter IP; no login, no CAPTCHA, no browser overhead.
- ✅ Validated output — every row is Pydantic-validated before it's pushed; a malformed listing is dropped, not shipped with garbage fields.
How to scrape JobStreet job listings
- Click Try for free and open the actor.
- Choose
country— MY, SG, PH, ID (JobStreet) or TH, HK (JobsDB). - Enter
keywords(optional — leave blank to browse all jobs for that country). - Optionally narrow with
location,work_type,date_posted, orsalary_min. - Toggle
fetch_detailfor full descriptions (bills thejob-detailevent per job). - Click Start and watch results stream into the dataset.
- Export as JSON, CSV, or Excel, or pull from the Apify API.
Search Malaysia for "python developer", full descriptions included:
{"country": "MY","keywords": "python developer","max_results": 100,"fetch_detail": true}
Browse all Singapore jobs, listings only (no detail fetch, cheaper):
{"country": "SG","max_results": 200,"fetch_detail": false}
Full-time jobs in Jakarta, posted this week:
{"country": "ID","keywords": "data analyst","location": "Jakarta","work_type": "full-time","date_posted": "week"}
JobStreet scraper input
| Field | Type | Default | Description |
|---|---|---|---|
country | enum | MY | Site to search: MY, SG, PH, ID (JobStreet) or TH, HK (JobsDB). |
keywords | string | — | Search terms, e.g. python developer. Blank browses all jobs. |
location | string | — | City/region filter, e.g. Kuala Lumpur. |
work_type | enum | — | full-time, part-time, contract, temporary, casual. |
salary_min | int | — | Minimum monthly salary, in the country's local currency. |
date_posted | enum | — | 24h, 3d, week, month. |
fetch_detail | bool | true | Fetch each job's full description (text + HTML). Bills the job-detail event. |
max_results | int | 200 | Cap per run (hard limit 10,000). |
max_concurrency | int | 4 | In-flight requests (1–20). |
max_requests_per_minute | int | 60 | Request-rate ceiling. |
proxy | object | — | Optional — see Do I need a proxy. |
JobStreet job data output
Each job is one dataset row. Sample from a live MY run (fetch_detail: true):
{"job_id": "93226956","title": "Software Engineer","company": "Lenovo","url": "https://my.jobstreet.com/job/93226956","country": "MY","location": "Bangsar South, Kuala Lumpur","salary_min": 6500,"salary_max": 8500,"salary_currency": "MYR","salary_period": "monthly","salary_raw": "RM 6,500 – RM 8,500 per month","work_type": "Full time","listing_date": "2026-07-09T08:18:13.000Z","teaser": "Join our engineering team building next-gen laptops...","description_text": "About the role: We are looking for a Software Engineer to join...","description_html": "<p>About the role...</p>","requirements": null,"benefits": null,"work_arrangement": "On-site","classification": "Engineering - Software (Information & Communication Technology)","sub_classification": null,"apply_url": "https://my.jobstreet.com/job/93226956","advertiser_id": "60303580","scraped_at": "2026-07-18T09:12:44.118203+00:00"}
With fetch_detail: false, only the listing-level fields (job_id through scraped_at, minus the detail-only fields) are returned — faster and cheaper.
| Field | Description |
|---|---|
job_id, title, company, url | Core identifiers and listing title. |
country, location | Which site the job came from and its location label. |
salary_min, salary_max, salary_currency, salary_period, salary_raw | Structured salary breakdown parsed from the raw label, plus the original text. |
work_type, listing_date, teaser | Employment type, when it was posted, and the short teaser blurb. |
description_text, description_html | Full job description (detail fetch only). |
work_arrangement, classification, sub_classification | On-site/hybrid/remote and SEEK's classification taxonomy (detail fetch only). |
apply_url, advertiser_id | Apply link and the advertiser's SEEK id (detail fetch only). |
scraped_at | Capture timestamp. |
Pricing
This actor uses pay-per-event pricing — you pay for what you scrape, not for time. Pricing below is provisional until Console monetization is finalized (see the Monetization tab for current live pricing).
| Event | USD | Per 1,000 |
|---|---|---|
| Actor start (per run) | $0.005 | — |
Job listing scraped (job-result) | $0.002 | $2 |
Full description fetched (job-detail) | $0.004 | $4 |
| Typical run | Cost |
|---|---|
100 jobs, listings only (fetch_detail: false) | ~$0.21 |
100 jobs, with full descriptions (fetch_detail: true) | ~$0.61 |
| 200 jobs, with full descriptions | ~$1.21 |
Do I need a proxy for JobStreet?
No, not for typical use. The SEEK GraphQL endpoint (/graphql) answers directly from a plain datacenter IP — no residential proxy required, unlike the site's own HTML routes (which sit behind a WAF challenge this actor never touches). A proxy is only useful for spreading a very high-volume run's requests across more IPs.
If you do run your own scrapers (inside or outside Apify) and need reliable proxies at scale, we use DataImpulse — pay-as-you-go IPs with per-country targeting and no monthly minimum:
👉 Get DataImpulse proxies (referral link)
Why this JobStreet scraper
- Six SEA markets, one schema — JobStreet (MY/SG/PH/ID) and JobsDB (TH/HK) normalized into the same flat, CSV-friendly row shape.
- No anti-bot browser tax — the GraphQL vector works from datacenter IPs, so runs are fast and cheap.
- Structured salary, not free text — currency, period, min/max parsed for every SEA currency format (comma- and dot-thousands).
- No official API key needed — JobStreet/JobsDB have no public API; this actor replicates the same GraphQL requests the sites' own frontend makes.
- Open source — the underlying
jobstreet-scraperPython package ships a Typer CLI and a FastAPI server; the Apify wrapper is a thin layer.
FAQ
Is this the official JobStreet/JobsDB API? No — neither JobStreet nor JobsDB publish an official public API. This actor scrapes the same public data via the same GraphQL requests the sites' own frontend makes.
Why isn't Vietnam included? jobstreet.vn redirects to Jora, a different SEEK platform with its own vector — out of scope for this actor.
What's the difference between JobStreet and JobsDB? Both are SEEK-owned brands sharing the same underlying platform and GraphQL API — JobStreet serves MY/SG/PH/ID, JobsDB serves TH/HK. This actor treats them identically; only the country you pick determines the brand.
Do I need a proxy? No — see Do I need a proxy for JobStreet.
How is fetch_detail pricing different? With fetch_detail: true, each job bills both a job-result event (the listing) and a job-detail event (the full description) — set it to false if you only need listing-level fields.
Is scraping JobStreet legal? This actor collects only publicly available job-listing data — no personal data beyond what advertisers publish. You are responsible for complying with JobStreet/JobsDB's terms and applicable laws.
Rate this actor ⭐
If the JobStreet SEA Scraper saved you time, please leave a review on its Apify Store page — ratings help other people find it and tell us what to build next. Hit a bug or missing field? Open an issue or contact us through the actor's Issues tab and we'll fix it fast — recency and reliability are what keep this actor ranking.
Related actors
Building a SEA job-market or recruitment pipeline? Pair this actor with our other scrapers — same proxy config format, same Pydantic-validated output, all open source.
- Indeed Job Scraper — cross-reference global job-market demand alongside SEA listings.
- levels.fyi Salary Scraper — benchmark tech salaries against JobStreet's structured salary data.
- LinkedIn Jobs Scraper — compare SEA listings against LinkedIn's global job postings.