JobStreet Scraper — MY, SG, ID & PH Job Listings avatar

JobStreet Scraper — MY, SG, ID & PH Job Listings

Pricing

from $2.00 / 1,000 results

Go to Apify Store
JobStreet Scraper — MY, SG, ID & PH Job Listings

JobStreet Scraper — MY, SG, ID & PH Job Listings

Scrape JobStreet Malaysia, Singapore, Indonesia & the Philippines (SEEK platform). Salary, full descriptions, company intelligence (logo, reviews, perks), and optional applicant-demand signals to find low-competition roles. Incremental mode emits only new and changed listings.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Black Falcon Data

Black Falcon Data

Maintained by Community

Actor stats

2

Bookmarked

79

Total users

24

Monthly active users

9.6 hours

Issues response

17 hours ago

Last modified

Share

What does JobStreet Scraper do?

JobStreet Scraper extracts structured job data from my.jobstreet.com, sg.jobstreet.com, id.jobstreet.com, and ph.jobstreet.com — JobStreet's Malaysia, Singapore, Indonesia, and Philippines job boards — including salary data, contact details, company metadata, work-arrangement tags, and full descriptions. It supports keyword search, location filters, classification codes, salary brackets, post-collection keyword and date filters, and controllable result limits, so you can run the same query consistently over time.

New to Apify? Sign up free and use the included $5 monthly platform credit to test this actor.

Key features

  • 🌏 Four-market coverage — one actor covers Southeast Asia: my.jobstreet.com, sg.jobstreet.com, id.jobstreet.com, and ph.jobstreet.com. One codebase, one input shape — pick a country per run or schedule parallel runs across markets.
  • ♻️ Incremental mode — recurring runs emit only NEW / UPDATED / REAPPEARED records. First run builds the baseline; subsequent runs emit and charge only for the diff. Saves 80–95% on daily monitoring.
  • 🔔 Notifications out of the box — Telegram, Slack, Discord, WhatsApp Cloud API, generic webhook. Pair with incremental + notifyOnlyChanges for daily "new JobStreet jobs" pings.
  • 🔗 Paste-mode URLs — paste any JobStreet URL straight from your browser: search-results URLs, category pages, or single job detail URLs (/job/<id>). Build the search in JobStreet's UI, copy, paste, run.
  • 🎯 Batch searches — pass ["python developer", "data engineer", "ML engineer"] in one run. One dedup state across all queries, single dataset, one Actor-Start charge instead of N.
  • 🔬 Post-filter pipeline — narrow results after collection with includeKeywords, excludeKeywords, fromDate, toDate, and maxAgeMinutes. Filters checked against title, company, description, and bullets.
  • 💰 Structured salarysalaryText parsed into salaryMin / salaryMax / salaryCurrency / salaryType automatically. MYR for MY, SGD for SG, IDR for ID, PHP for PH. No regex on your side.
  • 📋 Two-stage detail enrichment — toggle includeDetails: true to fetch each job's full detail page: complete description, structured location (state / suburb / postcode), employer profile, screening questions, work-arrangement tags.
  • 👥 Applicant demand signals — opt in with includeApplicantInsights to add applicantCount, applicantVolumeLabel (e.g. "High application volume"), and coverLetterPercentage to each job. Spot low-competition roles and gauge hiring demand. Available on standard-apply listings; external-apply listings return null.
  • 🏢 Company intelligence — when details are on, each job also carries companyLogo, companyCoverImageUrl, companyDescription, companyPerks, companyReviewRating / companyReviewCount, companySearchUrl, companyIndustry / companySize / companyWebsite, and isVerifiedAdvertiser. Populated for listings with a SEEK company profile; logo falls back to the ad's own branding.
  • 📧 Email + phone extractionextractedEmails[] and extractedPhones[] pulled from each description. Direct-outreach lists ready to ingest.
  • 📦 Compact mode — AI-agent and MCP-friendly payloads with core fields only. Pipe directly into LLM context, your ATS, or salary-benchmarking pipelines without parsing extras.

What data can you extract from jobstreet.com?

Each result includes core listing fields (jobId, seekJobId, title, canonicalUrl, advertiserId, location, locationCountry, locationState, locationSuburb, locationPostcode), salary data (salaryText, salaryMin, salaryMax, salaryCurrency, salaryType), employment metadata (employmentType, workArrangement, category, subCategory, roleId, postedDate, validThrough), detail fields when includeDetails: true (description, descriptionHtml, descriptionMarkdown, bulletPoints, teaser, screeningQuestions), contact and apply info (phoneNumber, applyUrl, applyEmail, contactName, extractedEmails, extractedPhones, extractedUrls, socialProfiles), and company metadata (company, companyUrl, companyIndustry, companySize, companyWebsite, companyDescription, companyLogo, companyCoverImageUrl, companyPerks, companyReviewRating, companyReviewCount, companySearchUrl, isVerifiedAdvertiser), and — when includeApplicantInsights: true — applicant-demand fields (applicantCount, applicantVolumeLabel, coverLetterPercentage). In standard mode, all documented fields are always present — unavailable values return as null, never omitted. In compact mode, only the core subset (jobId, title, company, location, salary, category, URL, dates) is returned for AI-agent and MCP pipelines.

Input

The main inputs are a search keyword, an optional location filter, and a result limit. Additional filters and options are available in the input schema.

Key parameters:

  • query — Job search keywords. For a single term: software engineer. For multiple terms (OR — runs each as a separate search and merges results, deduplicated by job ID), use a JSON array, for example: ["ERP Implementation", "ERP Initiatives"].
  • country — Which JobStreet market to search. (default: "MY")
  • location — City, state, or region. For a single location: Kuala Lumpur. For multiple locations, use a JSON array, for example: ["Kuala Lumpur", "Selangor", "Jakarta"].
  • startUrls — Direct JobStreet search or job-detail URLs. ✅ Valid shapes: https://my.jobstreet.com/jobs (all jobs), https://my.jobstreet.com/jobs-in-information-technology (category), https://sg.jobstreet.com/job/12345 (single job). ❌ The bare homepage (https://my.jobstreet.com) is not accepted — use a /jobs or /job/<id> path. Added on top of any query/location search (not a replacement) — each URL becomes an additional source in the same run. Detail URLs (/job/<id>) skip SERP entirely; search URLs paginate like a query. The market is derived from the URL host (sg. → SG, id. → ID, ph. → PH, otherwise MY). For search URLs, searchQuery is derived from keywords or /jobs/<slug>; filter-only URLs without keywords return searchQuery: "".
  • maxResults — Maximum total job listings to emit to the dataset. 0 = unlimited. Applied after post-filters — if you use includeKeywords / excludeKeywords / customFilters / date filters, set this to your final cap, not your collection cap. Cost control: Apify charges per emitted record, so this is your primary knob. If both maxResults and maxPages are set, the lower cap wins. (default: 25)
  • sortMode — Sort search results by relevance or date. (default: "relevance")
  • dateRange — Filter by posting date (JobStreet date range code, e.g. "1" = last 24h, "3" = last 3 days, "7" = last 7 days, "14" = last 14 days, "31" = last 31 days).
  • workType — Filter by employment type code.
  • workArrangement — Filter by work arrangement code.
  • classification — JobStreet job classification ID (e.g. "6281" = Information & Communication Technology, "1203" = Accounting, "6043" = Healthcare & Medical). Find IDs in JobStreet category URLs.
  • includeKeywords — Only keep jobs that contain at least one of these keywords anywhere in the listing — title, company, location, category, sub-category, work type, work arrangement, salary text, teaser, bullets, or description. Broad match by design — use exclude keywords below to narrow.
  • excludeKeywords — Drop jobs that contain any of these keywords in title, company, teaser, bullets, or description. Narrow scope by design — does NOT check location, salary text, or employment type, so "remote" won't drop jobs with "remote work allowance" in salary or "not remote" in location.
  • maxAgeMinutes — Only keep jobs posted within this many minutes from the scrape timestamp.
  • incrementalMode — Track changes between runs. Each record carries a changeType of NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. Default emits NEW + UPDATED + REAPPEARED only; use emitUnchanged / emitExpired to opt into the others. stateKey is optional — when empty, a stable key is auto-derived from your search inputs so different query/filter combinations get isolated state. (default: false)
  • stateKey — Optional stable identifier for the tracked search universe. Leave empty to auto-derive a stable identifier from your search inputs — different keyword/location/filter combinations get isolated state automatically.
  • includeDetails — Fetch each job's detail page for full description, structured location, salary data, company profile, and more. (default: true)
  • includeApplicantInsights — Add applicant-demand fields to each job: applicantCount (number of applicants), applicantVolumeLabel (e.g. "High application volume"), and coverLetterPercentage. Useful for spotting low-competition roles and gauging hiring demand. Adds one extra request per job, so it is slightly slower. Coverage is partial — only standard-apply listings expose this data; jobs that apply on an external site return null for these fields. (default: false)
  • compact — Output only core fields (jobId, title, company, location, salary, score, category, URL, dates). Ideal for AI-agent and MCP workflows. (default: false)
  • ...and 30 more parameters

Input examples

Basic MY search — Keyword + country search on my.jobstreet.com with full detail enrichment.

→ Each record carries the full description, structured location, parsed salary in MYR, and employer profile.

{
"query": "software engineer",
"country": "MY",
"maxResults": 25,
"includeDetails": true
}

Remote/hybrid jobs in Singapore — Filter SG market by work arrangement (3 = Remote, 2 = Hybrid, 1 = On-site).

→ All SG remote roles with full details. SGD currency parsed automatically.

{
"query": "developer",
"country": "SG",
"workArrangement": "3",
"maxResults": 10,
"includeDetails": true
}

Post-filter by keywords and age — Layer includeKeywords / excludeKeywords / maxAgeMinutes on top of any search. Filters check title, company, description, and bullets.

→ Only records that match python or typescript in the description, exclude any senior listings, and were posted in the last 7 days (10080 minutes).

{
"query": "software engineer",
"country": "SG",
"maxResults": 25,
"includeKeywords": [
"python",
"typescript"
],
"excludeKeywords": [
"senior"
],
"maxAgeMinutes": 10080,
"includeDetails": true
}

Incremental data engineer tracker (PH) — Recurring runs emit only NEW / UPDATED / REAPPEARED records since the previous run.

→ First run builds the baseline state. Subsequent runs emit and charge only for the diff. Set emitUnchanged: true or emitExpired: true for full visibility.

{
"query": "data engineer",
"country": "PH",
"maxResults": 200,
"incrementalMode": true,
"stateKey": "data-engineer-ph-tracker"
}

Compact mode for AI agents — Trimmed payload with only core fields. Ideal for piping into LLM context, MCP servers, or downstream automation.

→ Each record carries only jobId, title, company, location, salary fields, category, canonicalUrl, and date fields — no description or HTML bloat.

{
"query": "accountant",
"country": "ID",
"dateRange": "7",
"maxResults": 50,
"compact": true,
"includeDetails": false
}

Paste-mode (direct JobStreet URLs) — Pass any JobStreet URL — search-results pages or job detail URLs — directly in startUrls. Detail URLs skip SERP entirely.

→ One record per detail URL, fully enriched. Search URLs are paginated like a regular query.

{
"startUrls": [
"https://my.jobstreet.com/job/92131282"
],
"includeDetails": true
}

Output

Each run produces a dataset of structured job records. Results can be downloaded as JSON, CSV, or Excel from the Dataset tab in Apify Console.

Example job record

{
"jobId": "485469726b257aa48bceebec68c9213bdf9a52e7ba3595af9158237164ad24c0",
"seekJobId": "91247023",
"title": "Associate Software Engineer (0-2 years)",
"canonicalUrl": "https://my.jobstreet.com/job/91247023",
"company": "Software International Corporation (M) Sdn Bhd",
"companyUrl": "https://my.jobstreet.com/companies/software-international-corporation-168553406415897",
"advertiserId": "60627682",
"location": "Kuala Lumpur, Malaysia",
"locationCountry": "MY",
"locationState": "Kuala Lumpur",
"locationSuburb": null,
"locationPostcode": null,
"salaryText": null,
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": "MYR",
"salaryType": null,
"employmentType": "Full time",
"workArrangement": "hybrid",
"category": "Information & Communication Technology",
"subCategory": "Developers/Programmers",
"roleId": "software-engineer",
"teaser": "Gain proficiency in tools, programming, work closely with seniors. Prep docs, analyze problems, gather data, resolve issues in dev collaboration.",
"bulletPoints": [
"Hybrid Working Mode",
"Generous Annual Leave",
"Annual Performance Bonus, Increment, Individual Expenses Benefits"
],
"description": "Responsibilities:\n\nParticipate in enterprise application development and maintenance for large corporations both within Malaysia and Worldwide.\n\n· Develop knowledge and expertise in the applicat...",
"descriptionHtml": "<p><strong>Responsibilities:</strong></p><p>Participate in enterprise application development and maintenance for large corporations both within Malaysia and Worldwide.</p><p>·&nbsp;&nbsp;&nbsp;&nbsp;...",
"descriptionMarkdown": "**Responsibilities:**\n\nParticipate in enterprise application development and maintenance for large corporations both within Malaysia and Worldwide.\n\n· Develop knowledge and expertise in the applicatio...",
"descriptionLength": 2044,
"contentQuality": "full",
"companyIndustry": "Computer Software & Networking",
"companySize": "101-1,000 employees",
"companyWebsite": "http://www.sicmsb.com",
"phoneNumber": null,
"screeningQuestions": [
"How would you rate your English language skills?",
"Which of the following types of qualifications do you have?",
"How many years' experience do you have as a software engineer?",
"Which of the following statements best describes your right to work in Malaysia?",
"Which of the following front end development libraries and frameworks are you proficient in?",
"What's your expected monthly basic salary?",
"Which of the following programming languages are you experienced in?",
"Which of the following languages are you fluent in?"
],
"applyUrl": "https://www.seek.com.au/job/91247023?tracking=SHR-WEB-SharedJob-anz-1",
"postedDate": "2026-03-31T01:42:31.188Z",
"validThrough": "2026-04-30T13:59:59.999Z",
"contentHash": "dd34696968c2eb237697635c81982afa76418d985a7862da891ca6466965bb96",
"isSponsored": false,
"sourceUrl": "https://my.jobstreet.com/job/91247023",
"sourceCountry": "MY",
"sourceDomain": "my.jobstreet.com",
"searchQuery": "software engineer",
"searchUrl": "https://www.seek.com.au/jobs?keywords=software+engineer&where=Malaysia",
"scrapedAt": "2026-04-18T07:47:12.494Z",
"fetchedAt": "2026-04-18T07:47:12.494Z",
"detailFetched": true,
"extractedEmails": [],
"changeType": "NEW",
"trackedHash": "dd34696968c2eb237697635c81982afa76418d985a7862da891ca6466965bb96",
"firstSeenAt": "2026-04-18T07:47:12.494Z",
"lastSeenAt": "2026-04-18T07:47:12.494Z",
"previousSeenAt": null,
"expiredAt": null,
"stateKey": "live-verify-1776498430631",
"isRepost": false,
"repostOfId": null,
"repostDetectedAt": null
}

Incremental fields

When incremental: true, each record also carries:

  • changeType — one of NEW, UPDATED, UNCHANGED, REAPPEARED, EXPIRED. Default output covers NEW / UPDATED / REAPPEARED; set emitUnchanged: true or emitExpired: true to opt into the others.
  • firstSeenAt, lastSeenAt — ISO-8601 timestamps tracking the listing across runs.
  • isRepost, repostOfId, repostDetectedAt — populated when a new listing matches the tracked content of a previously expired one. Set skipReposts: true to drop detected reposts from the output.

How to scrape jobstreet.com

  1. Go to JobStreet Scraper in Apify Console.
  2. Enter a search keyword and optional location filter.
  3. Set maxResults to control how many results you need.
  4. Enable includeDetails if you need full descriptions, company data.
  5. Click Start and wait for the run to finish.
  6. Export the dataset as JSON, CSV, or Excel.

Use cases

  • Extract job data from jobstreet.com for market research and competitive analysis.
  • Track salary trends across regions and categories over time.
  • Monitor new and changed listings on scheduled runs without processing the full dataset every time.
  • Auto-apply or feed apply URLs into your ATS / hiring pipeline.
  • Research company hiring patterns, employer profiles, and industry distribution.
  • Feed structured data into AI agents, MCP tools, and automated pipelines using compact mode.
  • Export clean, structured data to dashboards, spreadsheets, or data warehouses.

How much does it cost to scrape jobstreet.com?

JobStreet Scraper uses pay-per-event pricing. You pay a small fee when the run starts and then for each result that is actually produced.

  • Run start: $0.01 per run
  • Per result: $0.002 per job record

Example costs:

  • 10 results: $0.03
  • 25 results: $0.06
  • 100 results: $0.21
  • 200 results: $0.41
  • 500 results: $1.01

Example: recurring monitoring savings

These examples compare full re-scrapes with incremental runs at different churn rates. Churn is the share of listings that are new or whose tracked content changed since the previous run. Actual churn depends on your query breadth, source activity, and polling frequency — the scenarios below are examples, not predictions.

Example setup: 100 results per run, daily polling (30 runs/month). Event-pricing examples scale linearly with result count.

Churn rateFull re-scrape run costIncremental run costSavings vs full re-scrapeMonthly cost after baseline
5% — stable niche query$0.21$0.02$0.19 (90%)$0.60
15% — moderate broad query$0.21$0.04$0.17 (81%)$1.20
30% — high-volume aggregator$0.21$0.07$0.14 (67%)$2.10

Full re-scrape monthly cost at daily polling: $6.30. First month with incremental costs $0.79 / $1.37 / $2.24 for the 5% / 15% / 30% scenarios because the first run builds baseline state at full cost before incremental savings apply.

FAQ

How many results can I get from jobstreet.com?

The number of results depends on the search query and available listings on jobstreet.com. Use the maxResults parameter to control how many results are returned per run.

Does JobStreet Scraper support recurring monitoring?

Yes. Enable incremental mode to only receive new or changed listings on subsequent runs. This is ideal for scheduled monitoring where you want to track changes over time without re-processing the full dataset.

Can I integrate JobStreet Scraper with other apps?

Yes. JobStreet Scraper works with Apify's integrations to connect with tools like Zapier, Make, Google Sheets, Slack, and more. You can also use webhooks to trigger actions when a run completes.

Can I use JobStreet Scraper with the Apify API?

Yes. You can start runs, manage inputs, and retrieve results programmatically through the Apify API. Client libraries are available for JavaScript, Python, and other languages.

Can I use JobStreet Scraper through an MCP Server?

Yes. Apify provides an MCP Server that lets AI assistants and agents call this actor directly. Use compact mode and descriptionMaxLength to keep payloads manageable for LLM context windows.

This actor extracts publicly available data from jobstreet.com. Web scraping of public information is generally considered legal, but you should always review the target site's terms of service and ensure your use case complies with applicable laws and regulations, including GDPR where relevant.

Your feedback

If you have questions, need a feature, or found a bug, please open an issue on the actor's page in Apify Console. Your feedback helps us improve.

You might also like

Getting started with Apify

New to Apify? Create a free account with $5 credit — no credit card required.

  1. Sign up — $5 platform credit included
  2. Open this actor and configure your input
  3. Click Start — export results as JSON, CSV, or Excel

Need more later? See Apify pricing.