JobStreet Jobs Scraper
Pricing
from $0.48 / 1,000 item extracteds
JobStreet Jobs Scraper
Extract public JobStreet jobs in Malaysia, Singapore, Indonesia and the Philippines. Search by keyword and location and export titles, employers, salary labels, dates and vacancy summaries for recruiting and labor-market datasets.
Pricing
from $0.48 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
Extract public JobStreet jobs from Malaysia, Singapore, Indonesia and the Philippines into a structured vacancy dataset. Search by keyword and location, then export job IDs, titles, employers, source salary labels, posting dates and short summaries for recruiting research and labor-market analysis.
This Actor collects search-result records. It does not access private applied jobs, jobseeker accounts or applicant data, and it does not fetch full advert descriptions.
Why use this Actor?
Recruitment analysts can refresh regional vacancy lists without managing a browser or copying search cards manually. Stable job IDs make it practical to join successive exports in your own database. Salary labels remain exactly as the source presents them: no guessed currency, pay period or missing salaries.
Use it for a bounded country search, not a census of every vacancy. You control the maximum unique jobs per run and can export the default dataset as JSON, CSV or Excel through Apify.
Who is it for?
- Recruiting teams building shortlists of advertised employer demand.
- Labor-market researchers comparing public vacancy titles and classifications over time.
- Data engineers loading recurring country-level search extracts into a warehouse.
Scheduling and cross-run comparisons are downstream workflows. This Actor does not maintain saved-search state or send alerts itself.
Supported countries
| Code | Country | Site |
|---|---|---|
| MY | Malaysia | my.jobstreet.com |
| SG | Singapore | sg.jobstreet.com |
| ID | Indonesia | id.jobstreet.com |
| PH | Philippines | ph.jobstreet.com |
Choose one country per run. Use separate runs for several countries; location text alone does not change the selected site. JobsDB Hong Kong/Thailand, SEEK Australia, USA and signed-in JobStreet services are not included.
Quick start
- Open the Actor and select a country.
- Enter a keyword such as
engineerand optionally a location in that country. - Set a maximum number of jobs from 1 to 1000.
- Start the Actor and wait for a successful terminal status.
- Open the Jobs dataset and export your preferred format.
The default input searches Malaysia for engineer and returns up to 100 unique records.
{"country": "MY","keyword": "engineer","location": "","maxItems": 100,"sortBy": "relevance"}
Input parameters
| Parameter | Default | Behavior |
|---|---|---|
country | MY | One of MY, SG, ID, PH; uppercase codes only. |
keyword | engineer | Source relevance search across vacancy text, not exact phrase/title equality. Empty string searches all jobs. |
location | empty | Country-specific text passed to source geographic search; empty means country-wide. |
maxItems | 100 | Global maximum unique job records per run, inclusive range 1–1000. |
sortBy | relevance | relevance or date (newest first according to source ranking). |
Keyword and location whitespace is trimmed. Search matching, synonyms, language handling and geographic boundaries are controlled by JobStreet, not local substring filters. A search for engineer can include related roles whose title does not contain that word. There are no multiple-keyword ANY/ALL or exact-phrase modes.
Unknown fields and unsupported values fail validation rather than being silently ignored. Explicit job/search URLs are not input modes.
Output fields
| Field | Meaning |
|---|---|
jobId | Source numeric vacancy identifier, represented as a string. |
url | Public country-site job URL. |
country | Selected country code. |
title | Public vacancy title. |
company | Employer display name; may be Private Advertiser or null. |
locations | Array of public location labels. |
listingDate | Source posting timestamp, when present. |
listingDateDisplay | Source relative-date label. |
teaser | Short search summary, not full advert text. |
salaryLabel | Source salary label, null if absent or blank. |
classifications | Source classification names. |
subclassifications | More specific source categories. |
workTypes | Employment type labels. |
workArrangements | Source labels such as On-site, when provided. |
bulletPoints | Public search-card highlights. |
scrapedAt | UTC collection timestamp. |
Optional scalar values are null; absent lists are empty arrays. No tracking tokens, raw source bodies or private applicant information are included.
Example result
This shortened public record was observed during a Malaysia engineer search; fields below reflect the actual output shape. The dataset also contains classifications, dates, highlights and work arrangements when supplied.
{"jobId": "95239788","url": "https://my.jobstreet.com/job/95239788","country": "MY","title": "Engineers (Project/Quality/Process/Production/Maintenance/Electrical)","company": "EPMB","locations": ["Shah Alam, Selangor"],"salaryLabel": null,"teaser": "Join a major new project in Melaka. Hiring Project, Quality, Process, Production, Maintenance, Electrical, Mechanical & Utilities Engineers."}
How much does it cost to extract JobStreet jobs?
Billing consists of a $0.005 one-time start event per valid run plus one item event for each unique vacancy saved to the dataset. Duplicate or rejected records have no item charge. Valid searches with no jobs have only the start charge. Invalid inputs fail before the start charge.
| Apify plan tier | Per job | 1,000 jobs plus start |
|---|---|---|
| FREE | $0.00092 | $0.925 |
| BRONZE | $0.0008 | $0.805 |
| SILVER | $0.000624 | $0.629 |
| GOLD / PLATINUM / DIAMOND | $0.00048 | $0.485 |
BRONZE examples including the start fee:
| Jobs returned | Estimated total |
|---|---|
| 10 | $0.013 |
| 100 | $0.085 |
| 1,000 | $0.805 |
There is no separate charge for salary labels, categories or summaries. Set the maximum charge in Apify to control spend; a billing cap may stop delivery before the requested result limit. Check the Pricing tab for the current applicable prices.
Limits and completeness
The Actor requests sequential pages of up to 100 source records and deduplicates by job ID within a run. It stops at maxItems, empty results, source-reported exhaustion or a repeated page with no new jobs. A 20-page safety bound prevents runaway pagination; reaching that bound without exhaustion fails the run rather than claiming full completion.
Zero and unlimited limits are not supported. Search indexes can change while pages are collected, and sponsored listings or ranking can move between pages. The maximum is a ceiling, not a guarantee of that many results, relevance or exhaustive country coverage.
Reliability and failure behavior
Only anonymous direct JSON search is enabled. No login, user cookies, paid proxy or browser input is required. Temporary network failures, rate limits and server errors receive at most two retries with bounded backoff; stable 4xx, non-JSON challenge pages and invalid response shapes fail clearly.
If a later page fails, previously saved rows remain available but are partial. Do not treat a failed run as a complete dataset. A successful empty search is a legitimate no-result response, not a hidden access error.
Integrations
- Schedule one Apify run per country and load its dataset into a spreadsheet or warehouse.
- Join
jobIdacross successful runs to detect additions and removals in your own pipeline. - Use Apify dataset exports or integrations with Make, Zapier or Google Sheets to pass records downstream.
- Compare
salaryLabelcautiously: absent salary is not zero, and labels can use different currencies or periods.
Store complete exports outside an LLM context when processing large datasets. This Actor does not provide automatic incremental updates, email alerts or historical backfill.
API usage
Start a run, retain its ID, check terminal status, and retrieve its default dataset. Replace the example environment variable with your own Apify token; never share it in public input.
cURL
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~jobstreet-jobs-scraper/runs' \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"country":"SG","keyword":"engineer","maxItems":100}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/jobstreet-jobs-scraper').call({country: 'MY', keyword: 'engineer', maxItems: 100});if (run.status !== 'SUCCEEDED') throw new Error(`Incomplete run ${run.id}`);const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 100 });console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/jobstreet-jobs-scraper').call(run_input={'country': 'PH', 'keyword': 'engineer', 'maxItems': 100})if run['status'] != 'SUCCEEDED':raise RuntimeError('Incomplete run: ' + run['id'])print(client.dataset(run['defaultDatasetId']).list_items(limit=100).items)
Use with MCP
Connect an Actor-specific subset rather than a changing broad category:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/jobstreet-jobs-scraper"
For Claude Desktop, Cursor, and VS Code HTTP-compatible clients:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/jobstreet-jobs-scraper"}}}
Authenticate through your client's supported Apify flow. Discover real tool names and argument schemas with scoped tools/list. Actor selection also exposes run/data helper tools; it does not expose exactly one tool. Discovery is read-only, not permission to execute or abort.
Example prompt: “Collect up to 25 public engineering jobs in Malaysia. Return titles, employers, salary labels and source URLs; mark missing salary as unavailable.”
For an authorized invocation, start once and retain the run/status/storage IDs. Those IDs are not result rows. call-actor waits at most 0–45 seconds (waitSecs, default 30). If nonterminal, follow the same run with get-actor-run, using bounded backoff such as 2, 4, 8 seconds capped at 10 and a total 120-second deadline. Set client timeout above the chosen server wait plus transport margin. After client timeout, recover the known run instead of starting another. If the ID is unknown, report uncertainty. At deadline report pending; on terminal failure report partial results honestly.
After success, use get-dataset-items with the returned defaultDatasetId, explicit limit/offset and required fields. A useful consumer budget is pages of 20 untransformed rows, at most 100 rows and 64 KiB serialized UTF-8 admitted to model context, whichever comes first. Enforce the byte limit host-side before model injection; disclose omitted/oversized rows. If the client cannot intercept oversized responses, do not claim a hard byte guarantee. Track source offsets and report continuation offset/truncation rather than claiming completeness. Keep full exports in storage. These are consumer context limits, not limits imposed on collection. Tool-discovery bytes and caching behavior vary by client; no numeric token-saving claim is made.
Legality and responsible use
Collect only public vacancy information for lawful purposes, respect source terms and applicable privacy/data rights, and avoid excessive repeated searches. Public availability is not a license for unrestricted redistribution. This Actor is independent and is not affiliated with JobStreet or SEEK.
The Actor uses no AI at runtime and sends no vacancy content to model providers. Actor datasets and logs follow your Apify account retention settings and can be deleted through Apify; no cross-run cache is kept. For help, open an Apify Store issue with the run link and non-sensitive reproduction details.
Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed; reports are retained for 30 days. Do not submit personal applicant data in input.
FAQ and troubleshooting
Why is a salary missing? The source does not publish salary for every listing. Missing values are null; no salary is inferred.
Why are results not exact keyword matches? JobStreet uses relevance matching across vacancy text and related terms. The Actor does not add local title-only matching.
Why did I get fewer jobs than the maximum? The search may be exhausted, deduplicated or repeated; an Apify billing cap can also truncate delivery. Check the run log and status.
What if I receive HTTP 403 or a challenge error? The source blocked that route. The run fails instead of inventing empty output. Contact the maintainer with the run link; this product has no automatic paid fallback.
Can I obtain descriptions or applications? No. This Actor returns public search summaries only, not full adverts, applicant information or applied-job history.
Related workflows
This is a standalone four-country vacancy-search product. Use Apify scheduling and dataset export for downstream refresh pipelines. No separate related Actor is required for the documented workflow.