# JobStreet Jobs Scraper (MY, SG, PH, ID) (`parseforge/jobstreet-scraper`) Actor

Scrape JobStreet job listings from Malaysia, Singapore, the Philippines and Indonesia with full descriptions, parsed salaries and company profiles. Export to CSV, Excel, JSON or XML.

- **URL**: https://apify.com/parseforge/jobstreet-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 job listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 💼 JobStreet Jobs Scraper

> 🚀 **Export JobStreet job listings from Malaysia, Singapore, the Philippines and Indonesia in seconds.** 48 fields per job, full descriptions, salaries parsed into numbers, exact ISO listing and expiry dates, and the employer's profile (industry, size, rating, website) on every row.

This Actor collects job listings from the four JobStreet country sites (my.jobstreet.com, sg.jobstreet.com, ph.jobstreet.com and id.jobstreet.com). It reads the same JSON endpoints the JobStreet website itself uses, so every field you see on a listing page is in your dataset, plus the fields the page hides: the exact listing timestamp, the expiry date, the application screening questions and the employer's company profile.

Coverage at the time of writing: 15,571 live "engineer" jobs in Malaysia, 22,472 in Singapore, 14,505 in the Philippines and 9,016 in Indonesia, all reachable to the last page. Search by keyword, location, classification (29 industries, 336 sub-classifications), work type, work arrangement, listing date and salary band, or paste JobStreet search and job URLs directly.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Recruiters and staffing agencies in Southeast Asia | Build daily feeds of new openings per role, city or industry |
| HR analysts and compensation teams | Benchmark salary bands with numeric min/max/currency/period |
| Job boards and aggregators | Syndicate listings with full descriptions and employer logos |
| Sales and lead generation teams | Spot companies that are hiring, with size, industry and website |
| Researchers and journalists | Track hiring demand across MY, SG, PH and ID over time |

### 📋 What the JobStreet Jobs Scraper does

- Searches any of the four JobStreet country sites by keyword and location, with every filter the site offers.
- Pages through the full result set at 100 listings per call, deduplicated by job ID.
- Optionally opens each job to add the full description (text and HTML), expiry date, status, application questions, cover image and video.
- Attaches the employer's company profile: industry, size, website, star rating, review count and about text.
- Parses the salary label into `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod`, handling RM, S$, PHP and Indonesian Rp formats.
- Accepts JobStreet search URLs and single job URLs as input, honouring the filters in the URL.

> 💡 **Why it matters:** JobStreet shows "2d ago" and "RM 3,100 – RM 3,500 per month" as text. This Actor gives you the exact ISO timestamp, the expiry date and the salary as numbers, so you can sort, filter and chart hiring data instead of cleaning it by hand.

### 🎬 Full Demo (🚧 Coming soon)

### 📊 Output

| Field | Description |
|---|---|
| 🖼 `imageUrl` | Employer logo |
| 📌 `title` | Job title |
| 🔗 `url` | Canonical job URL on the country site |
| 🆔 `id` | JobStreet job ID |
| 🏢 `company` | Employer name as shown on the listing |
| 🌐 `companyUrl` | Employer profile URL on JobStreet |
| 🏷 `companyId` | JobStreet company profile ID |
| 📇 `advertiserId` | Advertiser account ID |
| ✅ `advertiserVerified` | Whether JobStreet has verified the advertiser (Yes/No) |
| 📍 `location` | Location label (suburb, city, region) |
| 🌏 `country` / 🏳 `countryCode` | Country name and ISO code |
| ⏱ `workType` | Full time, Part time, Contract/Temp, Casual/Vacation |
| 🏠 `workArrangement` | On-site, Hybrid, Remote |
| 🗂 `classification` / 📂 `subClassification` | Industry classification and sub-classification, with their IDs |
| 🎯 `normalizedRole` | JobStreet's normalized role slug (e.g. `data-analyst`) |
| 💰 `salary` | Salary label as published |
| 💵 `salaryMin` / 💸 `salaryMax` | Parsed numeric bounds |
| 💱 `salaryCurrency` / 📆 `salaryPeriod` | ISO currency and pay period (month, year, hour, day) |
| 📅 `listedAt` / 🗓 `listedAtDisplay` | Exact ISO listing timestamp and the "2d ago" label |
| ⌛ `expiresAt` | Listing expiry timestamp |
| 🚦 `status` / 🔚 `isExpired` / ⭐ `isFeatured` / 📢 `adType` | Listing state flags |
| 📝 `teaser` / 🔸 `bulletPoints` | Short summary and the employer's highlight bullets |
| 📄 `descriptionText` / 🧬 `descriptionHtml` / 📏 `descriptionLength` | Full job description as plain text and HTML |
| ❔ `applicationQuestions` | Screening questions asked at apply time |
| 🖼 `coverImageUrl` / 🎥 `videoUrl` | Employer branding media |
| 🏭 `companyIndustry` / 👥 `companySize` / 🔗 `companyWebsite` | Employer profile facts |
| ⭐ `companyRating` / 🗣 `companyReviewCount` / 🏢 `companyDescription` / 🔗 `companyJobsUrl` | Employer reviews and about text |
| 🕒 `scrapedAt` | When the row was collected |
| ❌ `error` | Always `null` on data rows; error rows carry only this field and are never charged |

Values the employer withholds are returned as `Not Disclosed`; structurally inapplicable values are `N/A`. No field is ever `null` except `error`.

#### Sample records

```json
{
  "imageUrl": "https://image-service-cdn.seek.com.au/7871b3842076b35de89d3ee9ccda08d1d10140db/ee4dce1061f3f616224767ad58cb2fc751b8d2dc",
  "title": "Operations Engineer",
  "url": "https://ph.jobstreet.com/job/94391238",
  "id": "94391238",
  "company": "Manila Water Company, Inc.",
  "companyUrl": "https://ph.jobstreet.com/companies/manila-water-company-inc-168557661846653",
  "companyId": "168557661846653",
  "advertiserId": "60244064",
  "advertiserVerified": "Yes",
  "location": "Metro Manila",
  "country": "Philippines",
  "countryCode": "PH",
  "workType": "Full time",
  "workArrangement": "Not Disclosed",
  "classification": "Engineering",
  "subClassification": "Other",
  "classificationId": "N/A",
  "subClassificationId": "N/A",
  "normalizedRole": "N/A",
  "salary": "Not Disclosed",
  "salaryMin": "Not Disclosed",
  "salaryMax": "Not Disclosed",
  "salaryCurrency": "Not Disclosed",
  "salaryPeriod": "Not Disclosed",
  "listedAt": "2026-09-03T06:25:28.045Z",
  "listedAtDisplay": "14h ago",
  "expiresAt": "2026-10-03T13:59:59.999Z",
  "status": "Active",
  "isExpired": "No",
  "isFeatured": "No",
  "adType": "N/A",
  "teaser": "Conduct hands-on operation of the wastewater plant for implementation of operational philosophies, programs, and plans.",
  "bulletPoints": [],
  "descriptionText": "QUALIFICATIONS:\n• Candidate must possess at least a Bachelor's/College Degree in Engineering (Mechanical, Electrical, Chemical, or Sanitary).\n\n• Fresh grad or a...",
  "descriptionHtml": "<p><strong>QUALIFICATIONS:</strong></p><ul><li><p>Candidate must possess at leas...",
  "descriptionLength": 1661,
  "applicationQuestions": [
    "How many years' experience do you have as an Operations Engineer?",
    "Which of the following types of qualifications do you have?",
    "What's your expected monthly basic salary?",
    "Do you have a valid Philippine driver's licence?",
    "Are you willing to relocate for this role?"
  ],
  "coverImageUrl": "Not Disclosed",
  "videoUrl": "Not Disclosed",
  "companyIndustry": "Electricity, Gas & Water Services",
  "companySize": "1,001-5,000 employees",
  "companyWebsite": "http://www.manilawater.com",
  "companyRating": 4.4,
  "companyReviewCount": 67,
  "companyDescription": "At Manila Water, we take pride in our way of working, serving, and caring that defines who we are...",
  "companyJobsUrl": "https://ph.jobstreet.com/Manila-Water-Company,-Inc.-jobs/at-this-company",
  "scrapedAt": "2026-09-03T21:03:50.959Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://bx-branding-gateway.cloud.seek.com.au/bd3c8728-5406-4c44-962c-023d472a6e0e.1/jdpLogo",
  "title": "Business Analyst - Data Analytics (Chief Data Office)",
  "url": "https://sg.jobstreet.com/job/94400061",
  "id": "94400061",
  "company": "Synapxe",
  "companyUrl": "https://sg.jobstreet.com/companies/synapxe-175608056282578",
  "companyId": "175608056282578",
  "advertiserId": "60286019",
  "advertiserVerified": "Yes",
  "location": "One North, Central Region",
  "country": "Singapore",
  "countryCode": "SG",
  "workType": "Full time",
  "workArrangement": "On-site",
  "classification": "Information & Communication Technology",
  "subClassification": "Business/Systems Analysts",
  "classificationId": "6281",
  "subClassificationId": "6283",
  "normalizedRole": "Data-Business-Analyst",
  "salary": "Not Disclosed",
  "salaryMin": "Not Disclosed",
  "salaryMax": "Not Disclosed",
  "salaryCurrency": "Not Disclosed",
  "salaryPeriod": "Not Disclosed",
  "listedAt": "2026-09-03T10:05:17Z",
  "listedAtDisplay": "10h ago",
  "expiresAt": "2026-10-03T09:56:03.000Z",
  "status": "Active",
  "isExpired": "No",
  "isFeatured": "No",
  "adType": "ORGANIC",
  "teaser": "Business Intelligence, Business Analyst",
  "bulletPoints": [
    "Pioneer innovative HealthTech solutions",
    "Grow your professional knowledge via Synapxe academy",
    "Enjoy vibrant work environment with competitive perks!"
  ],
  "descriptionText": "Company description:\n\nSynapxe is the national HealthTech agency inspiring tomorrow's health...",
  "descriptionHtml": "Company description:<br><br><p>Synapxe is the national HealthTech agency inspiri...",
  "descriptionLength": 2561,
  "applicationQuestions": [],
  "coverImageUrl": "https://image-service-cdn.seek.com.au/d0b46c3f084dac71482e8029dad811e79976fdbf/a868bcb8fbb284f4e8301904535744d488ea93c1",
  "videoUrl": "Not Disclosed",
  "companyIndustry": "Computer Software & Networking",
  "companySize": "1,001-5,000 employees",
  "companyWebsite": "https://www.synapxe.sg/",
  "companyRating": "Not Disclosed",
  "companyReviewCount": "Not Disclosed",
  "companyDescription": "Synapxe is the national HealthTech agency inspiring tomorrow's health. The nexus of HealthTech, we connect people and sy...",
  "companyJobsUrl": "https://sg.jobstreet.com/Synapxe-jobs/at-this-company",
  "scrapedAt": "2026-09-03T21:03:53.370Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://bx-branding-gateway.cloud.seek.com.au/458bfe2b-6e68-499f-908a-dc049293e6c4.1/jdpLogo",
  "title": "FIELD ENGINEER",
  "url": "https://my.jobstreet.com/job/94354951",
  "id": "94354951",
  "company": "GroWTh Avenue",
  "companyUrl": "https://my.jobstreet.com/companies/growth-avenue-168555825327536",
  "companyId": "168555825327536",
  "advertiserId": "60179686",
  "advertiserVerified": "Yes",
  "location": "Shah Alam/Subang",
  "country": "Malaysia",
  "countryCode": "MY",
  "workType": "Full time",
  "workArrangement": "On-site",
  "classification": "Engineering",
  "subClassification": "Field Engineering",
  "classificationId": "1209",
  "subClassificationId": "6030",
  "normalizedRole": "field-engineer",
  "salary": "RM 3,500 – RM 4,500 per month",
  "salaryMin": 3500,
  "salaryMax": 4500,
  "salaryCurrency": "MYR",
  "salaryPeriod": "month",
  "listedAt": "2026-09-02T02:42:35Z",
  "listedAtDisplay": "1d ago",
  "expiresAt": "2026-10-02T13:59:59.999Z",
  "status": "Active",
  "isExpired": "No",
  "isFeatured": "No",
  "adType": "ORGANIC",
  "teaser": "Degree in any relevant engineering field (Mechanical/Civil/Instrumentation/Electornics etc.) The ability to build and maintain strong working...",
  "bulletPoints": [
    "Attractive salary package",
    "Career growth opportunity",
    "Good working culture"
  ],
  "descriptionText": "• Degree in any relevant engineering field (Mechanical/Civil/Instrumentation/Electornics etc.)\n\n• The ability to build and maintain strong working relationships...",
  "descriptionHtml": "<ul><li><p>Degree in any relevant engineering field...",
  "descriptionLength": 1434,
  "applicationQuestions": [
    "Which of the following statements best describes your right to work in Malaysia?",
    "What's your expected monthly basic salary?",
    "Which of the following types of qualifications do you have?",
    "How many years' experience do you have as a field engineer?"
  ],
  "coverImageUrl": "https://image-service-cdn.seek.com.au/39d355047bc6079f7dcd785974fe013ba9edc463/a868bcb8fbb284f4e8301904535744d488ea93c1",
  "videoUrl": "Not Disclosed",
  "companyIndustry": "Professional Services",
  "companySize": "11-50 employees",
  "companyWebsite": "http://www.growthavenue.com.my/",
  "companyRating": "Not Disclosed",
  "companyReviewCount": "Not Disclosed",
  "companyDescription": "Growth Avenue Sdn Bhd (GASB) is a wholly own Bumiputra company. We are specialising in the field of...",
  "companyJobsUrl": "https://my.jobstreet.com/GroWTh-Avenue-jobs/at-this-company",
  "scrapedAt": "2026-09-03T21:02:25.540Z",
  "error": null
}
```

### ✨ Why choose this Actor

- **Four countries, one input.** Pick Malaysia, Singapore, the Philippines or Indonesia, or paste URLs from any of the four sites in one run.
- **Numbers, not labels.** Salary bounds, currency and period are parsed on every listing that publishes a salary; listing and expiry dates are exact ISO timestamps.
- **The employer comes with the job.** Industry, company size, website, star rating, review count and about text are attached without a second Actor.
- **Every JobStreet filter, verified.** All 29 classifications and 336 sub-classifications were enumerated against the live API, so the dropdowns only contain values that return results.
- **Application questions.** The screening questions candidates must answer are exposed per job, a field most alternatives skip.
- **Honest sentinels.** `Not Disclosed` means the employer withheld it; `N/A` means it does not apply. You never get a silent `null`.

### 📈 How it compares to alternatives

| | This Actor | Typical JobStreet scrapers |
|---|---|---|
| Countries | MY, SG, PH, ID | Often one or two |
| Fields per job | 48 | 15 to 25 |
| Salary | Label plus parsed min/max/currency/period | Label only |
| Dates | Exact ISO listing and expiry timestamps | "2d ago" strings |
| Employer profile | Industry, size, website, rating, reviews, about | Company name only |
| Application questions | Yes | No |
| Filters | Classification (29) and sub-classification (336) dropdowns, work type, arrangement, date, salary band, sort | Keyword and location |
| Input | Keywords or JobStreet search/job URLs | Keywords only |
| Depth | Full result set, 100 listings per call | Sometimes capped at a few pages |

Per-call detail fetching means a job costs one extra API request when "Fetch full job details" is on. Turn it off for a listing-only run that is several times faster.

### 🚀 How to use

1. [Create a free Apify account](https://console.apify.com/sign-up?fpr=vmoqkp) and get $5 of free monthly usage credit.
2. Open the [JobStreet Jobs Scraper](https://apify.com/parseforge/jobstreet-scraper) page and click **Try for free**.
3. Type your keywords (e.g. `data analyst`), pick a country and optionally a location, then set any filters.
4. Set **Max Items** and click **Start**.
5. Download the dataset as CSV, Excel, JSON or XML, or pull it through the API.

Example input for the freshest hybrid ICT jobs in Singapore:

```json
{
  "keywords": "software engineer",
  "country": "SG",
  "classification": "6281",
  "workArrangement": "Hybrid",
  "dateRange": "7",
  "sortMode": "ListedDate",
  "maxItems": 200
}
```

### 💼 Business use cases

#### Recruitment and staffing

Run the Actor every morning with `dateRange: "1"` and `sortMode: "ListedDate"` to get every job posted in the last 24 hours for the roles you place, complete with the hiring company's size and website for outreach.

#### Compensation benchmarking

Filter by classification and location, then group `salaryMin` and `salaryMax` by `subClassification` to build pay bands per city. The `salaryPeriod` and `salaryCurrency` fields keep monthly RM and annual S$ figures from being mixed.

#### Lead generation

Employers posting many jobs are growing. Count rows per `companyId`, join `companyIndustry`, `companySize` and `companyWebsite`, and hand the list to sales.

#### Job aggregation

Syndicate listings with `descriptionHtml`, `imageUrl` and `expiresAt`, and drop rows automatically once `isExpired` flips to Yes on a re-run.

### 🔌 Automating JobStreet Jobs Scraper

- **Make / Zapier:** trigger the Actor on a schedule and push new rows into Google Sheets, HubSpot or Airtable.
- **Slack:** post a daily digest of new jobs matching your filters.
- **Airbyte:** load the dataset into your warehouse for trend analysis.
- **GitHub Actions:** call the Apify API from a workflow to refresh a public jobs page.
- **Google Drive:** export the dataset as Excel after every run.

### 🌟 Beyond business use cases

- **Research:** measure hiring demand by industry and city across Southeast Asia over time.
- **Personal:** watch a handful of employers and get notified when they post a role that matches you.
- **Non-profit:** track public-sector and healthcare openings for community job boards.
- **Experimentation:** feed `descriptionText` into an LLM to extract skills, seniority and visa requirements.

### 🤖 Ask an AI assistant about this scraper

> I want to collect job postings from JobStreet. Look at https://apify.com/parseforge/jobstreet-scraper and tell me how to configure a run that pulls every Engineering job posted in the last 7 days in Penang, Malaysia, and how to turn the salaryMin and salaryMax fields into a pay-band report.

### ❓ Frequently Asked Questions

#### 🌏 Which JobStreet sites are supported?

Malaysia (my.jobstreet.com), Singapore (sg.jobstreet.com), the Philippines (ph.jobstreet.com) and Indonesia (id.jobstreet.com). Pick one in the **Country** field or paste URLs from any of them.

#### 🔑 Do I need a JobStreet account or cookies?

No. Everything comes from the public endpoints the JobStreet website itself uses.

#### 💰 Why is the salary "Not Disclosed" on many rows?

Because the employer did not publish one. JobStreet does not force employers to show a salary, and the Actor never invents a number. When a salary is published, it is returned both as the original label and as parsed numbers.

#### 📅 What is the difference between `listedAt` and `listedAtDisplay`?

`listedAt` is the exact ISO timestamp from JobStreet's data; `listedAtDisplay` is the "2d ago" text shown on the page.

#### 🗂 How do I filter by industry?

Use the **Classification** dropdown (29 industries) and optionally **Sub-classification** (336 role families). Both lists were verified against the live site, and the IDs are the same across all four countries.

#### 🔗 Can I paste a JobStreet URL?

Yes. Search URLs such as `https://my.jobstreet.com/engineer-jobs/in-Kuala-Lumpur?daterange=7` are parsed, including the filters in the query string, and job URLs such as `https://sg.jobstreet.com/job/94383160` return that single job.

#### ⚡ How fast is it?

Listing-only runs fetch 100 jobs per request. With "Fetch full job details" on, each job costs one extra request; a 1,000-job run typically finishes in a few minutes.

#### 🛡 Do I need a proxy?

Not at moderate volume. The proxy option is off by default. Turn on Apify Proxy (datacenter is enough) for very large runs, or if you see rate-limit retries in the log.

#### 📉 Is there a ceiling on results?

The Actor pages to the end of JobStreet's result set for the query, so the ceiling is the number of jobs matching your filters. Narrow queries with classification or location to keep runs focused.

#### 🧾 What happens on an error?

Errors are written as rows containing only the `error` field so you can see what failed. Error rows are never charged.

#### 🔁 Can I re-run to detect expired jobs?

Yes. Paste the job URLs (or re-run the search) and check `isExpired` and `status` on each row.

#### 💳 How am I charged?

Per result row delivered. Error rows are free.

### 🔌 Integrate with any app

The dataset is available through the Apify API and every Apify integration: Google Sheets, Make, Zapier, Airbyte, Slack, webhooks, and the Apify SDKs for JavaScript and Python.

### 🔗 Recommended Actors

- [SEEK Australia Jobs Scraper](https://apify.com/parseforge/seek-scraper) for the same platform in Australia.
- [Workday Jobs Scraper](https://apify.com/parseforge/workday-jobs-scraper) for employers hosting careers on Workday.
- [Greenhouse Jobs Scraper](https://apify.com/parseforge/greenhouse-jobs-scraper) for employers on Greenhouse.
- [Lever Jobs Scraper](https://apify.com/parseforge/lever-jobs-scraper) for employers on Lever.
- [SmartRecruiters Jobs Scraper](https://apify.com/parseforge/smartrecruiters-jobs-scraper) for employers on SmartRecruiters.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** this is an independent tool and is not affiliated with, endorsed by, or connected to JobStreet, SEEK or any employer whose listings you scrape. It collects only publicly available data.

# Actor input Schema

## `startUrls` (type: `array`):

Optional. JobStreet search URLs (e.g. https://my.jobstreet.com/engineer-jobs/in-Kuala-Lumpur?daterange=7) or single job URLs (https://sg.jobstreet.com/job/94383160). When set, these override the keyword/country fields below. Filters in the URL query string are honoured.

## `keywords` (type: `string`):

Job title, skill or company to search for. Leave empty to list every job in the selected country (optionally narrowed by the filters below).

## `country` (type: `string`):

Which JobStreet site to search. Each country is a separate site with its own listings.

## `location` (type: `string`):

Optional city, state or region as JobStreet spells it, e.g. "Kuala Lumpur", "Penang", "Central Region", "Metro Manila", "Jakarta Selatan".

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `classification` (type: `string`):

Industry classification, same list as the JobStreet search page.

## `subClassification` (type: `string`):

Narrower role family inside a classification. Works on its own or together with Classification.

## `workType` (type: `string`):

Employment type filter.

## `workArrangement` (type: `string`):

Where the work happens.

## `dateRange` (type: `string`):

Only jobs listed within this many days.

## `salaryMin` (type: `integer`):

Lower bound of the salary filter, in local currency (RM, S$, PHP or Rp). JobStreet snaps the value to its own salary bands (e.g. 3,000 / 4,500 / 6,000 / 8,000 monthly in Singapore), so use round figures. Leave empty for no minimum.

## `salaryMax` (type: `integer`):

Upper bound of the salary filter, in local currency, snapped to JobStreet's salary bands. Leave empty for no maximum.

## `salaryType` (type: `string`):

Whether the salary bounds above are monthly or annual figures.

## `sortMode` (type: `string`):

Result order. Use "Date listed" together with Max Items to grab only the freshest postings.

## `includeDetails` (type: `boolean`):

Opens each job (one extra API call) to add the full description, expiry date, application questions and the employer profile (industry, size, rating, website). Turn off for a faster, listing-only run.

## `proxyConfiguration` (type: `object`):

Off by default; JobStreet's public API answers without a proxy at moderate volume. Switch on Apify Proxy (datacenter is enough) for large runs or if you see rate limiting.

## Actor input object example

```json
{
  "keywords": "engineer",
  "country": "MY",
  "maxItems": 10,
  "salaryType": "monthly",
  "sortMode": "KeywordRelevance",
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Every scraped listing in a formatted table

## `fullData` (type: `string`):

Complete dataset with all 48 fields

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": "engineer",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/jobstreet-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": "engineer",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/jobstreet-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": "engineer",
  "maxItems": 10
}' |
apify call parseforge/jobstreet-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/jobstreet-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wEHXibOeS4xIoguZ8/builds/IsrFIfHhjIDc07gNU/openapi.json
