JobStreet & JobsDB Scraper — MY SG PH ID TH HK Jobs avatar

JobStreet & JobsDB Scraper — MY SG PH ID TH HK Jobs

Pricing

from $2.00 / 1,000 job listings

Go to Apify Store
JobStreet & JobsDB Scraper — MY SG PH ID TH HK Jobs

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

bootforge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

  • 🌏 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 salarysalary_min, salary_max, salary_currency (MYR/SGD/PHP/IDR/THB/HKD), and salary_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

  1. Click Try for free and open the actor.
  2. Choose countryMY, SG, PH, ID (JobStreet) or TH, HK (JobsDB).
  3. Enter keywords (optional — leave blank to browse all jobs for that country).
  4. Optionally narrow with location, work_type, date_posted, or salary_min.
  5. Toggle fetch_detail for full descriptions (bills the job-detail event per job).
  6. Click Start and watch results stream into the dataset.
  7. 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

FieldTypeDefaultDescription
countryenumMYSite to search: MY, SG, PH, ID (JobStreet) or TH, HK (JobsDB).
keywordsstringSearch terms, e.g. python developer. Blank browses all jobs.
locationstringCity/region filter, e.g. Kuala Lumpur.
work_typeenumfull-time, part-time, contract, temporary, casual.
salary_minintMinimum monthly salary, in the country's local currency.
date_postedenum24h, 3d, week, month.
fetch_detailbooltrueFetch each job's full description (text + HTML). Bills the job-detail event.
max_resultsint200Cap per run (hard limit 10,000).
max_concurrencyint4In-flight requests (1–20).
max_requests_per_minuteint60Request-rate ceiling.
proxyobjectOptional — 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.

FieldDescription
job_id, title, company, urlCore identifiers and listing title.
country, locationWhich site the job came from and its location label.
salary_min, salary_max, salary_currency, salary_period, salary_rawStructured salary breakdown parsed from the raw label, plus the original text.
work_type, listing_date, teaserEmployment type, when it was posted, and the short teaser blurb.
description_text, description_htmlFull job description (detail fetch only).
work_arrangement, classification, sub_classificationOn-site/hybrid/remote and SEEK's classification taxonomy (detail fetch only).
apply_url, advertiser_idApply link and the advertiser's SEEK id (detail fetch only).
scraped_atCapture 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).

EventUSDPer 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 runCost
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-scraper Python 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.

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.