# JobStreet Scraper: Jobs and Salaries in MY, SG, PH, ID, HK, TH (`themineworks/jobstreet-jobs-scraper`) Actor

Scrape JobStreet (Malaysia, Singapore, Philippines, Indonesia) and JobsDB (Hong Kong, Thailand) jobs by keyword and location: title, company, location, salary with parsed range, work type, remote or hybrid, listing date, classification and link, plus optional full description. No login.

- **URL**: https://apify.com/themineworks/jobstreet-jobs-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 jobs

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## JobStreet Scraper: Jobs and Salaries in MY, SG, PH, ID, HK, TH

[![600 JobStreet jobs from Malaysia and the Philippines in 23 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/jobstreet-jobs-scraper-hero.png)](https://console.apify.com/actors/Krhlo6BKhfyG0RXlI/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

### Why choose this actor?

- **Six country sites in one actor.** JobStreet Malaysia, Singapore, Philippines and Indonesia, and JobsDB Hong Kong and Thailand, all on the same input. Our final test run returned 600 of 600 jobs from Malaysia and the Philippines in 23 seconds, and a second run read 80 jobs with full descriptions from the other four sites.
- **Salary you can sort and filter.** Besides the salary text exactly as the job shows it, every row with an amount gets `salary_min`, `salary_max`, the ISO currency and the pay period. In our test run 285 of the 286 salary labels that contained a number were read into numbers; the one left out was a perk ("Day 1 HMO"), not pay.
- **No login, no cookies, no proxy to set up, and you only pay for jobs you receive.** The actor reads the same public job search the sites show to anyone. A refused page, a search with no results and a job already delivered for another keyword in the same run are never charged.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/Krhlo6BKhfyG0RXlI/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Jobs and hiring family:** [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Shine.com Jobs Scraper](https://apify.com/themineworks/shine-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Internshala Scraper](https://apify.com/themineworks/internshala-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns 20 software engineer jobs from JobStreet Malaysia in a few seconds:

```json
{
  "keywords": ["software engineer"],
  "countries": ["my"],
  "maxJobs": 20
}
```

`keywords` takes job titles or skills, one per line; each keyword is searched on each country site in `countries` (`my`, `sg`, `ph`, `id`, `hk`, `th`). An empty `keywords` list returns every job that matches the other filters. `location` takes a city, state or area as you would type it on the site, such as `Kuala Lumpur`, `Makati` or `Bangkok`.

On Apify's free plan every run returns the first 10 results as a preview, so you can check the data and the fields before you pay. A paid Apify plan returns every result: https://apify.com/pricing?fpr=ymnoit

#### Copy to your AI assistant

```text
themineworks/jobstreet-jobs-scraper on Apify. Scrapes job listings from JobStreet Malaysia, Singapore, Philippines and Indonesia and JobsDB Hong Kong and Thailand, one row per job with title, company, location, salary text plus parsed min, max, currency and period, work type, on-site/hybrid/remote, listing date, category and link, with optional full description. Call ApifyClient("TOKEN").actor("themineworks/jobstreet-jobs-scraper").call(run_input={"keywords": ["software engineer"], "countries": ["my", "sg"], "maxJobs": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: none (defaults: keywords ["software engineer"], countries ["my"]). Optional: keywords (list; empty list = all jobs), countries (my, sg, ph, id, hk, th), location (text), datePosted ("1", "3", "7", "14" or "31" days), workType ("full-time", "part-time", "contract-temp", "casual-vacation"), workArrangement ("on-site", "hybrid", "remote"), salaryMin and salaryMax (local currency), salaryPeriod ("monthly", "annual", "hourly"; default "monthly"), sortBy ("relevance" or "date"), maxJobs (default 100, 20 to 5000 per keyword per country), includeDescription (default false). Full spec: GET https://api.apify.com/v2/acts/themineworks~jobstreet-jobs-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **31 fields per job, 6 more with descriptions**: title, company, advertiser id, location and region, country, salary text with parsed minimum, maximum, currency and period, work type, on-site/hybrid/remote, category and sub category with ids, listing date and age, short description, the employer's selling points, badges such as "Urgently hiring", logo, link, and the keyword and rank that found it.
- **Full description on demand**: switch on `includeDescription` for the complete job description as plain text and HTML, the closing date, the job status, the employer's screening questions and whether the site verified the advertiser.
- **Every filter the sites offer**: location, date posted (24 hours to 31 days), work type, on-site/hybrid/remote, salary range per month, year or hour, and best match or newest first.
- **From 20 to 5,000 jobs per search**, 100 per page, every page reachable (we read page 56 of a 5,544 job search). Each keyword on each country site is its own search; three run at a time.
- **No double charging across keywords**: a job found by two keywords or on a second page is delivered once.
- **A run summary you can audit**: the `OUTPUT` record lists every search's status, total jobs on the site, pages read, attempts and duplicates, and the success rate per site.

### How to use it

#### Basic: one keyword on one site

```json
{
  "keywords": ["accountant"],
  "countries": ["sg"],
  "maxJobs": 100
}
```

#### Several keywords on several country sites

Each keyword runs on each site: this input is 4 searches of up to 150 jobs, 600 jobs in all (our final test run, 23 seconds):

```json
{
  "keywords": ["accountant", "data analyst"],
  "countries": ["my", "ph"],
  "maxJobs": 150
}
```

#### Job: daily new job alerts

Newest first, listed in the last 24 hours, one city. Save it as a task and add a daily schedule (Console > Schedules); each run returns the day's new listings.

```json
{
  "keywords": ["nurse"],
  "countries": ["sg"],
  "datePosted": "1",
  "sortBy": "date",
  "maxJobs": 200
}
```

#### Job: salary benchmarking across Southeast Asia

The same role on all six sites, with `salary_min`, `salary_max`, `salary_currency` and `salary_period` ready to compare. About half of the jobs on these sites show pay (49% in our test run).

```json
{
  "keywords": ["data analyst"],
  "countries": ["my", "sg", "ph", "id", "hk", "th"],
  "maxJobs": 300
}
```

#### Job: remote roles with full descriptions for a job board

Remote only, full time, with the complete description, closing date and screening questions:

```json
{
  "keywords": ["customer support", "virtual assistant"],
  "countries": ["ph"],
  "workArrangement": "remote",
  "workType": "full-time",
  "includeDescription": true,
  "maxJobs": 100
}
```

#### Job: hiring activity in one city

Leave `keywords` empty to get every job in an area, then count by `company_name` or `classification` to see who is hiring:

```json
{
  "keywords": [],
  "countries": ["my"],
  "location": "Penang",
  "datePosted": "7",
  "maxJobs": 1000
}
```

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `keywords` | array of strings | `["software engineer"]` | Job titles or skills, one per line. Each is its own search on every site chosen. An empty list returns all jobs that match the other filters. |
| `countries` | array | `["my"]` | Country sites: `my` (my.jobstreet.com), `sg` (sg.jobstreet.com), `ph` (ph.jobstreet.com), `id` (id.jobstreet.com), `hk` (hk.jobsdb.com), `th` (th.jobsdb.com). |
| `location` | string | empty | A city, state or area as typed on the site. Applies to every site chosen; empty means the whole country. |
| `datePosted` | string | any | `1`, `3`, `7`, `14` or `31`: jobs listed within that many days. |
| `workType` | string | any | `full-time`, `part-time`, `contract-temp` or `casual-vacation`. |
| `workArrangement` | string | any | `on-site`, `hybrid` or `remote`. |
| `salaryMin` | integer | none | Minimum pay in the site's currency, per `salaryPeriod`. Applied by the site. |
| `salaryMax` | integer | none | Maximum pay, same currency and period. |
| `salaryPeriod` | string | `monthly` | `monthly`, `annual` or `hourly`: what the salary filter amounts mean. |
| `sortBy` | string | `relevance` | `relevance` (best match) or `date` (newest first). |
| `maxJobs` | integer | `100` | Upper limit per search (one keyword on one site), 20 to 5,000. The sites serve 100 jobs a page. |
| `includeDescription` | boolean | `false` | Adds the full description, closing date, status, screening questions and advertiser verification. One extra request per job. |

### What data do you get?

One row per job. A job found by two keywords, or on two pages, is delivered once.

**The job**: `job_id`, `title`, `company_name`, `advertiser_id`, `work_type`, `work_arrangement`, `classification`, `classification_id`, `subclassification`, `subclassification_id`, `listing_date`, `listing_date_display`, `teaser`, `bullet_points`, `tags`, `company_logo_url`, `job_url`.

**Where**: `location`, `region`, `country_code`, `country`, `site`.

**Pay**: `salary_text` (exactly as shown), `salary_min`, `salary_max`, `salary_currency`, `salary_period` (`hour`, `day`, `week`, `month` or `year`).

**With `includeDescription`**: `description` (plain text), `description_html`, `job_status`, `expires_at`, `advertiser_verified`, `screening_questions`, and `description_error` on the rare row whose details could not be read.

**The search**: `search_keyword`, `search_location`, `search_rank`, `scraped_at`.

How full the fields were in our final test runs (600 jobs from Malaysia and the Philippines; descriptions from 80 jobs in Singapore, Hong Kong, Indonesia and Thailand):

| Field | Filled | Why not always |
|---|---|---|
| `job_id`, `title`, `company_name`, `location`, `work_type`, `work_arrangement`, `classification`, `listing_date`, `teaser`, `job_url` | 100% | |
| `advertiser_id` | 96% | A few private advertisers have none. |
| `company_logo_url` | 82% | Not every employer uploads a logo. |
| `region` | 76% | Only when the site gives a two level location (city and state). |
| `bullet_points` | 52% | Only when the employer added selling points. |
| `salary_text` | 49% | About half of employers hide their pay. |
| `salary_min`, `salary_max`, `salary_currency` | 47% to 48% | Labels without an amount ("Negotiable", "Market Aligned") have none. |
| `salary_period` | 44% | Only when the label says per hour, month or year. |
| `tags` | 20% | Badges such as "Urgently hiring" or "Expiring soon". |
| `description`, `description_html`, `job_status`, `expires_at` | 100% of 80 | With `includeDescription` on. |
| `screening_questions` | 48% of 80 | Only when the employer set questions. |

#### Stable fields for automations

These fields were present in every row of our test runs and their names will not change:

| Field | Meaning |
|---|---|
| `job_id` | Job id on JobStreet or JobsDB, the same on every site |
| `title` | Job title |
| `company_name` | Hiring company or recruiter as shown |
| `location` | Location as shown, for example `Petaling Jaya, Selangor` |
| `country_code` | `MY`, `SG`, `PH`, `ID`, `HK` or `TH` |
| `site` | Site the job was found on, for example `my.jobstreet.com` |
| `work_type` | `Full time`, `Part time`, `Contract/Temp` or `Casual/Vacation` |
| `work_arrangement` | `On-site`, `Hybrid` or `Remote` |
| `classification` | Job category, for example `Accounting` |
| `listing_date` | When the job was listed, ISO 8601 UTC |
| `teaser` | Short description from the search results |
| `job_url` | Link to the job page |
| `search_rank` | Position of the job in its search |
| `scraped_at` | When the job was read, ISO 8601 UTC |

#### Output examples

Real rows from our test runs on 5 October 2026; the long description is trimmed.

**JobStreet Malaysia, salary read into numbers**:

```json
{
  "job_id": "94955829",
  "title": "Accountant",
  "company_name": "Panthera Corporation",
  "advertiser_id": "62457017",
  "location": "Petaling Jaya, Selangor",
  "region": "Selangor",
  "country_code": "MY",
  "country": "Malaysia",
  "site": "my.jobstreet.com",
  "salary_text": "RM 7,500 per month",
  "salary_min": 7500,
  "salary_max": 7500,
  "salary_currency": "MYR",
  "salary_period": "month",
  "work_type": "Full time",
  "work_arrangement": "On-site",
  "classification": "Accounting",
  "classification_id": "1200",
  "subclassification": "Financial Accounting & Reporting",
  "subclassification_id": "6151",
  "listing_date": "2026-10-02T09:27:00Z",
  "listing_date_display": "3d ago",
  "teaser": "The Accountant will help coordinate, administer, and support activities that are critical to the functioning of the Panthera Malaysia team.",
  "company_logo_url": "https://bx-branding-gateway.cloud.seek.com.au/5b939989-99c9-440b-a633-65b49253ce45.1/jdpLogo",
  "job_url": "https://my.jobstreet.com/job/94955829",
  "search_keyword": "accountant",
  "search_rank": 44,
  "scraped_at": "2026-10-05T18:05:56.303Z"
}
```

**JobStreet Philippines, a remote job with selling points and a badge** (pay not shown by the employer):

```json
{
  "job_id": "94572139",
  "title": "Senior Staff Accountant | WFH (A-SVA)",
  "company_name": "Sourcefit",
  "advertiser_id": "60275551",
  "location": "Eastwood, Metro Manila",
  "region": "Metro Manila",
  "country_code": "PH",
  "country": "Philippines",
  "site": "ph.jobstreet.com",
  "work_type": "Full time",
  "work_arrangement": "Remote",
  "classification": "Accounting",
  "classification_id": "1200",
  "subclassification": "Financial Accounting & Reporting",
  "subclassification_id": "6151",
  "listing_date": "2026-09-11T04:57:32Z",
  "listing_date_display": "24d ago",
  "teaser": "Senior Staff Accountant to oversee accounting functions including financial reporting, general ledger, and month-end closing.",
  "bullet_points": ["Work from home Set Up", "Competitive Salary", "HMO Benefit"],
  "tags": ["Expiring soon"],
  "company_logo_url": "https://bx-branding-gateway.cloud.seek.com.au/a009e466-1469-4e9c-bfd2-d416453d7ac5.1/jdpLogo",
  "job_url": "https://ph.jobstreet.com/job/94572139",
  "search_keyword": "accountant",
  "search_rank": 78,
  "scraped_at": "2026-10-05T18:05:56.701Z"
}
```

**JobStreet Singapore with `includeDescription` on** (description trimmed here; the row holds all of it):

```json
{
  "job_id": "95063436",
  "title": "Associate Engineer ( Enterprise & Digital Solutions)",
  "company_name": "NetLink Trust",
  "advertiser_id": "60183816",
  "location": "Bedok, East Region",
  "region": "East Region",
  "country_code": "SG",
  "country": "Singapore",
  "site": "sg.jobstreet.com",
  "work_type": "Full time",
  "work_arrangement": "On-site",
  "classification": "Information & Communication Technology",
  "classification_id": "6281",
  "subclassification": "Database Development & Administration",
  "subclassification_id": "6286",
  "listing_date": "2026-10-05T10:06:17Z",
  "listing_date_display": "8h ago",
  "teaser": "Responsible for supporting enterprise and digital solutions used by internal and external customers.",
  "bullet_points": ["Motivated and Supportive Workforce", "Training & Development Opportunity", "Workforce Diversity"],
  "company_logo_url": "https://bx-branding-gateway.cloud.seek.com.au/9b300de5-eb91-4e19-86a5-d2390ab09c2d.1/jdpLogo",
  "job_url": "https://sg.jobstreet.com/job/95063436",
  "search_keyword": "data analyst",
  "search_rank": 17,
  "scraped_at": "2026-10-05T18:06:19.966Z",
  "description": "The Associate Engineer is responsible for supporting enterprise and digital solutions used by internal and external customers.\nResponsibilities:\n1. Enterprise & Digital Solutions Support:\n\n• Provide ongoing production and change request support for enterprise and digital applications (e.g. Helix, Service Web Portal, B2B, Order Service & Management, SharePoint, Qlik, etc.) and their associated interfaces with ERP/S2C and OSS/BSS applications. ...",
  "description_html": "<p>The Associate Engineer is responsible for supporting enterprise and digital solutions used by internal and external customers.</p> ...",
  "job_status": "Active",
  "expires_at": "2026-11-04T12:59:59.999Z",
  "advertiser_verified": true,
  "screening_questions": [
    "Which of the following statements best describes your right to work in Singapore?",
    "What's your expected monthly basic salary?",
    "Which of the following types of qualifications do you have?",
    "How many years' experience do you have using SQL queries?"
  ]
}
```

### Pricing

Pay per event: you pay for the job rows you receive, plus a flat $0.005 per run, whatever memory you choose.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `job-scraped` | Once per job row stored in your dataset | $0.75 per 1,000 | $0.75 per 1,000 | $0.75 per 1,000 | $0.75 per 1,000 |
| `run-start` | Once per run, when it starts | $0.005 | $0.005 | $0.005 | $0.005 |

The price per single job is the price per 1,000 divided by 1,000. A job with the full description costs the same as one without.

Free plan runs return up to 10 results each; paid plans have no cap.

Never charged:

- search pages the sites refused, and searches the run could not read;
- searches with no results;
- a job already delivered earlier in the same run (found by another keyword, or on another site's search);
- the info row at the end of a run;
- anything past your "Max cost per run": the actor stops delivering when your limit is reached instead of sending rows for free.

### FAQ

#### What exactly does this actor read?

The public job search of JobStreet (my.jobstreet.com, sg.jobstreet.com, ph.jobstreet.com, id.jobstreet.com) and JobsDB (hk.jobsdb.com, th.jobsdb.com), which all run on the SEEK platform. It reads the same search results the sites show to anyone without signing in, and, with `includeDescription`, the same job details a job page shows.

#### How many jobs can I get?

Up to 5,000 per search (one keyword on one site), 100 per page. Every page of a search is reachable: in our tests we read page 56 of a 5,544 job search. For more, add keywords or sites; each is its own search of up to 5,000.

#### What do I get on the free plan?

Every run on Apify's free plan returns the first 10 results, so you can check the data and the fields before you pay. A paid Apify plan returns every result, up to the limit you set.

#### How long does a run take?

Without descriptions, one request brings up to 100 jobs: 600 jobs from 4 searches on 2 sites took 23 seconds in our final test. With descriptions each job needs one more request: 80 jobs took 23 to 55 seconds in our tests, eight read at a time per search.

#### How fresh is the data?

Every run reads the sites live. `listing_date` is when the employer listed the job; use `datePosted` and `sortBy: "date"` for new jobs only, and a schedule for daily runs.

#### How is the salary read?

`salary_text` is the label exactly as the job shows it. When it holds an amount, the actor fills `salary_min` and `salary_max` (equal for a single figure, only `salary_max` for "up to"), `salary_currency` (from the label or the site: RM is MYR, ฿ is THB, Rp is IDR, a plain $ is SGD in Singapore, HKD in Hong Kong and USD on the other sites, unless the site marks the currency) and `salary_period` when the label says per hour, month or year. Thousands written with dots (Rp 5.500.000) and "k" amounts ($70k, 40-50k) are read correctly. Labels without an amount give only `salary_text`.

#### How wide is a location?

The site decides. `location` is passed to the site's own search, which also returns nearby areas: a search for Makati returns Metro Manila listings and remote jobs too, as it does on the site. `location`, `region` and `country_code` on each row tell you where each job really is.

#### Do I need an account, cookies or a proxy?

No account, no cookies and nothing to set up. The actor reads the sites' public search and job details data over Apify's datacenter proxy. The job pages themselves are behind a bot check for datacenter visitors; the actor does not open them and does not need them. In our tests every search page and every job details request was answered, with no bot check.

#### What if a job is taken down while the run reads it?

The row is still delivered with everything from the search, and `description_error` says the details could not be read. In our test runs all 80 of 80 descriptions were read.

#### Can I monitor new jobs over time?

Yes. Save the input as a task with `datePosted: "1"` and `sortBy: "date"`, add a daily schedule, and use `job_id` to keep only jobs you have not seen.

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and an HTML table, from the run's dataset in Console or through the API.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

- Connector URL: https://mcp.apify.com/?tools=themineworks/jobstreet-jobs-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http jobstreet-jobs-scraper "https://mcp.apify.com/?tools=themineworks/jobstreet-jobs-scraper"`

#### Is it legal to scrape JobStreet and JobsDB?

The actor only reads job listings that the sites show publicly to anyone without signing in, and it never asks for the recruiter phone or contact fields the sites keep. Some descriptions name a contact person; you are responsible for how you use the data, for the sites' terms, and for data protection law such as GDPR, CCPA and the local laws of the countries involved (Malaysia's PDPA, Singapore's PDPA, the Philippines' Data Privacy Act). If in doubt, ask a lawyer about your use case.

### Integrations

- **Google Sheets**: send each run's rows to a sheet with Apify's Google Sheets integration, or import the CSV link of the dataset.
- **Make, Zapier and n8n**: start the actor and read its dataset with the Apify apps and nodes, for example "new remote jobs to Slack".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Shine.com Jobs Scraper](https://apify.com/themineworks/shine-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Internshala Scraper](https://apify.com/themineworks/internshala-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Indeed Jobs Scraper](https://apify.com/themineworks/indeed-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instahyre Jobs Scraper](https://apify.com/themineworks/instahyre-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Apna Jobs Scraper](https://apify.com/themineworks/apna-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CutShort Jobs Scraper](https://apify.com/themineworks/cutshort-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Jobs Scraper](https://apify.com/themineworks/linkedin-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Recruiting & Jobs MCP](https://apify.com/themineworks/recruiting-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a search that should return jobs and does not? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For another job site, a new source or a field you need, email dmineworks@gmail.com.

*Search JobStreet and JobsDB in six countries by keyword, location, date, work type and salary, and get every job back as a clean row with its pay read into numbers.*

# Actor input Schema

## `keywords` (type: `array`):

Job titles or skills to search for, one per line, for example "software engineer" or "accountant". Each keyword is its own search on every country site chosen. Leave the list empty to get every job that matches the other filters.

## `countries` (type: `array`):

JobStreet Malaysia, Singapore, Philippines and Indonesia, and JobsDB Hong Kong and Thailand. Each keyword is searched on each site chosen.

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

Optional. A city, state or area as you would type it on the site, for example "Kuala Lumpur", "Penang", "Makati", "Jakarta Selatan" or "Bangkok". Applies to every country site chosen; leave blank for the whole country.

## `datePosted` (type: `string`):

Only jobs listed within the last N days.

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

Only jobs of this type.

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

Only jobs with this work arrangement, as the employer listed it.

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

Optional. In the site's local currency (RM, S$, PHP, IDR, HK$, THB), per the salary period below. The site applies it; jobs that hide their pay can still match, as on the site.

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

Optional. Same currency and period as the minimum.

## `salaryPeriod` (type: `string`):

What the salary filter amounts mean. Pay on these sites is mostly quoted per month.

## `sortBy` (type: `string`):

Best match first, or newest first. Use newest first for daily monitoring.

## `maxJobs` (type: `integer`):

Upper limit for each search (one keyword on one country site). The sites serve 100 jobs a page. Minimum 20.

## `includeDescription` (type: `boolean`):

Adds the full description (plain text and HTML), expiry date, job status, the employer's screening questions and whether the advertiser is verified. One extra request per job, so runs take longer.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "countries": [
    "my"
  ],
  "location": "",
  "datePosted": "",
  "workType": "",
  "workArrangement": "",
  "salaryPeriod": "monthly",
  "sortBy": "relevance",
  "maxJobs": 100,
  "includeDescription": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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": [
        "software engineer"
    ],
    "countries": [
        "my"
    ],
    "location": "",
    "datePosted": "",
    "workType": "",
    "workArrangement": "",
    "salaryPeriod": "monthly",
    "sortBy": "relevance",
    "maxJobs": 100,
    "includeDescription": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/jobstreet-jobs-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": ["software engineer"],
    "countries": ["my"],
    "location": "",
    "datePosted": "",
    "workType": "",
    "workArrangement": "",
    "salaryPeriod": "monthly",
    "sortBy": "relevance",
    "maxJobs": 100,
    "includeDescription": False,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/jobstreet-jobs-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": [
    "software engineer"
  ],
  "countries": [
    "my"
  ],
  "location": "",
  "datePosted": "",
  "workType": "",
  "workArrangement": "",
  "salaryPeriod": "monthly",
  "sortBy": "relevance",
  "maxJobs": 100,
  "includeDescription": false
}' |
apify call themineworks/jobstreet-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/jobstreet-jobs-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/Krhlo6BKhfyG0RXlI/builds/4jplhxADaVV2J4zqh/openapi.json
