# JobStreet & JobsDB Scraper — Asia Jobs & Salaries, No Phones (`highbrow_fame/jobstreet-jobsdb-jobs`) Actor

JobStreet and JobsDB jobs from Malaysia, Singapore, the Philippines, Indonesia, Hong Kong and Thailand: company, salary with numbers, work type, category, date and the full ad. No phones.

- **URL**: https://apify.com/highbrow\_fame/jobstreet-jobsdb-jobs.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 job delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 & JobsDB Scraper — Asia Jobs & Salaries, No Phones

Get job ads from JobStreet (Malaysia, Singapore, the Philippines, Indonesia) and JobsDB (Hong Kong, Thailand): title, company, location, the salary as the site shows it plus its minimum, maximum, period and currency, work type, on-site / hybrid / remote, job category, listing date, the short pitch and key points — and, unless you switch it off, the full ad, its closing date and the employer's industry, size and rating. Paste your search links, or type keywords and places.

**Why this one**

- 🌏 **Six countries, one actor, the same fields.** my.jobstreet.com, sg.jobstreet.com, ph.jobstreet.com, id.jobstreet.com, hk.jobsdb.com and th.jobsdb.com — mix them in one run.
- 🔗 **Your search, as you set it up.** Set the filters on the site and paste the link, or type keywords and places here ("accountant" in "Kuala Lumpur", "customer service" in "Makati City") and choose category, work type, on-site / hybrid / remote, salary and "posted within" below.
- 📄 **The full ad at no extra cost.** A live run delivered 5,891 jobs from four searches in 156 seconds, every one of them with its full ad, closing date and status; 3,306 of them also with the employer's industry.
- 💰 **Salaries you can sort by.** Next to the site's own line ("RM 5,000 – RM 7,500 per month") every job has `salaryMin`, `salaryMax`, `salaryPeriod` and `salaryCurrency` — for 1,450 of the 1,514 jobs that showed a salary in that run. The run also checks the salary range you ask for, because the sites let jobs through whose pay is below it.
- 🔒 **No phone numbers, no recruiter names.** Companies are named by their company name only. Phone numbers (also the 8-digit ones of Singapore and Hong Kong), e-mail addresses, WhatsApp and LINE contacts and the names of contact persons ("contact Ms …", "聯絡 … 小姐", "ติดต่อ คุณ…", a Singapore agency's "EA Personnel" line) are taken out of the ad text.
- 💸 **You pay only for jobs delivered.** A link that is not a JobStreet or JobsDB search, or a place the site does not know, comes back as a free record with the reason.

### What you get

For every job:

| Field | What it is |
|---|---|
| `title`, `jobId`, `url` | the job ad |
| `company`, `advertiserId`, `logo` | who is hiring ("Private Advertiser" when the employer stays hidden) |
| `location`, `country` | where, as the site shows it |
| `salary`, `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency` | the site's salary line, and its numbers (period `month`, `year`, `hour`, `day` or `week`) |
| `workType`, `workArrangement` | Full time / Part time / Contract/Temp / Casual/Vacation, and On-site / Hybrid / Remote |
| `classification`, `subClassification` | the site's job category ("Accounting" → "Financial Accounting & Reporting") |
| `teaser`, `bulletPoints`, `tags` | the short pitch, the key points and the site's labels ("Urgent", "Expiring soon") |
| `listedAt`, `isFeatured` | when it was listed, and whether it is a promoted listing |
| `input`, `place`, `position`, `scrapedAt`, `status`, `error` | which search it came from, and why a search gave nothing |

With **Full job ad** (on by default) also: `description` (the full ad as plain text), `expiresAt`, `adStatus`, `isPrivateAdvertiser`, `companyIndustry`, `companySize`, `companyRating` — and `detailsError` for a job whose ad could not be read.

#### Example

A real record from a live run, 25 September 2026 (description shortened):

```json
{
  "input": "https://my.jobstreet.com/accountant-jobs/in-Kuala-Lumpur",
  "place": "Kuala Lumpur",
  "position": 7,
  "jobId": "94844550",
  "url": "https://my.jobstreet.com/job/94844550",
  "title": "Senior Accountant / Accountant",
  "company": "Stream Empire",
  "location": "Kuala Lumpur",
  "country": "MY",
  "classification": "Accounting",
  "subClassification": "Financial Accounting & Reporting",
  "workType": "Full time",
  "workArrangement": "On-site",
  "salary": "RM 5,000 – RM 7,500 per month",
  "salaryMin": 5000,
  "salaryMax": 7500,
  "salaryPeriod": "month",
  "salaryCurrency": "MYR",
  "teaser": "We are Asia’s leading retail and e-commerce network in activewear and lifestyle.",
  "bulletPoints": ["STAFF PURCHASE DISCOUNT", "DENTAL & VISION CARE", "HEALTH SCREENING SUBSIDY"],
  "listedAt": "2026-09-24T01:28:51Z",
  "isFeatured": false,
  "description": "Job Descriptions:\nAssist in the preparation of monthly management accounts, financial reports, and Board papers in a timely and accurate manner.\nSupport in annual budget preparation, forecasting, and financial projection exercises…",
  "expiresAt": "2026-10-24T12:59:59.999Z",
  "adStatus": "Active",
  "isPrivateAdvertiser": false,
  "companyIndustry": "Fashion Retail & Department Stores",
  "companySize": "101-1,000 employees",
  "companyRating": 2.9,
  "status": "OK"
}
```

### How to use it

1. Paste **Search links** from JobStreet or JobsDB, one per line — or type **Keywords** and **Places** (every keyword is searched in every place) and pick the **Country**.
2. Optionally choose **Job categories**, **Work type**, **On-site, hybrid or remote**, **Min / Max salary** (a month, in the local currency), **Posted within** and the **Order**.
3. Set **Max jobs per search**, press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

For a daily feed of new jobs, save your input as a task with **Posted within** set to "Last 24 hours" and schedule it every morning.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per job delivered** — see the price on this page. The full ad costs nothing extra. Links that are not JobStreet or JobsDB searches and places the site does not know are free.

### FAQ

**How many jobs per search?** As many as the site has: a live run read 10,000 of the 51,270 jobs in all of Malaysia from one search link, 100 pages deep, with no job twice, in 257 seconds.

**Are the filters obeyed?** Yes. In a live run: 2,000 of 2,000 Singapore ICT jobs from a "full time, last 14 days" link were ICT and full time and inside the site's 14-day window; 757 of 757 "customer service" jobs in Makati City were hybrid or remote and listed within 14 days, and none of those showing a monthly peso salary topped out under the 30,000 asked for — the run itself left out 28 jobs the site let through; 347 Hong Kong accountant jobs from a "from HK$30,000" link showed a monthly salary, none topping out under 30,000. Jobs that do not show a salary are kept when the site matches them on the pay the employer gave it privately.

**Why do so many jobs have no salary?** Many employers do not show one: 5,794 of 10,000 jobs in Malaysia had a salary line, but only 1,514 of 5,891 in the Singapore, Hong Kong, Thailand and Philippines searches above. `salaryMin` / `salaryMax` stay empty for lines like "Competitive" or "Attractive bonus".

**Which places can I type?** What the site understands: cities, states, provinces and districts as the site writes them, such as "Kuala Lumpur", "Penang", "Makati City", "Jakarta Raya" or "Bangkok" (the `place` field shows what the site took). A place the site does not know ("Atlantis City" in a live run) comes back as a free `NOT_FOUND` record.

**Are recruiters' contact details in the data?** No — apply through the job's `url`. Phone numbers, e-mail addresses, WhatsApp and LINE contacts and the names of contact persons are taken out of the title, teaser, key points and full ad and replaced with `[phone removed]`, `[e-mail removed]`, `[contact removed]` or `[name removed]`. In a live run with 3,799 full ads (HR jobs in Hong Kong, jobs in Bangkok, recruitment consultants in Singapore, sales jobs in Penang), 596 ads had something taken out: 422 e-mail addresses, 252 phone numbers, 160 names and 47 chat contacts. A scan of the result found a contact person's first name left in 2 ads ("Contact HR S… at …"); that wording is caught now. Rules can miss an unusual wording, which is why the full ad can be switched off: with **Full job ad** off only the title, teaser and key points come, through the same rules.

**Is this affiliated with JobStreet, JobsDB or SEEK?** No. This is an independent tool that reads the job ads JobStreet and JobsDB publish on their websites.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

## `searchUrls` (type: `array`):

Set up a search on JobStreet (my/sg/ph/id.jobstreet.com) or JobsDB (hk/th.jobsdb.com) with the filters you want and paste the address of the results page. One per line. Each link searches its own country.

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

Or search here without a link: job titles or keywords (accountant, data analyst, registered nurse). Each keyword is searched in each place below; without places, in the whole country.

## `locations` (type: `array`):

Cities, states, provinces or districts as the site writes them (Kuala Lumpur, Penang, Makati City, Cebu, Jakarta, Surabaya, Kowloon, Bangkok, Chon Buri). A place without keywords gives all its jobs.

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

Which site the keywords and places are searched on. A search link decides this itself.

## `classifications` (type: `array`):

Optional: only jobs in any of these categories (the sites' own classification).

## `workTypes` (type: `array`):

Optional: only jobs of any of these kinds.

## `workArrangements` (type: `array`):

Optional: only jobs with any of these arrangements.

## `minSalary` (type: `integer`):

Optional, in the site's currency a month (MYR, SGD, PHP, IDR, HKD, THB). Jobs whose shown pay stays under it are left out; jobs that do not show pay are kept when the site matches them.

## `maxSalary` (type: `integer`):

Optional. Jobs whose shown pay starts above it are left out.

## `postedWithinDays` (type: `string`):

Optional: only jobs listed recently.

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

The order the site returns the jobs in (it matters when you stop at a maximum).

## `maxListingsPerSearch` (type: `integer`):

Stops each search (each link, or each keyword in each place) after this many jobs.

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

Adds the full job ad as plain text, its closing date, and the employer's industry, size and rating (one extra request per 50 jobs).

## `maxConcurrency` (type: `integer`):

How many searches to work on at the same time.

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

Used only when the site turns a request down: the first try goes out directly.

## Actor input object example

```json
{
  "searchUrls": [
    "https://my.jobstreet.com/accountant-jobs/in-Kuala-Lumpur"
  ],
  "country": "MY",
  "postedWithinDays": "any",
  "sortBy": "relevance",
  "maxListingsPerSearch": 30,
  "includeDetails": true,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "searchUrls": [
        "https://my.jobstreet.com/accountant-jobs/in-Kuala-Lumpur"
    ],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/jobstreet-jobsdb-jobs").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 = {
    "searchUrls": ["https://my.jobstreet.com/accountant-jobs/in-Kuala-Lumpur"],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/jobstreet-jobsdb-jobs").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 '{
  "searchUrls": [
    "https://my.jobstreet.com/accountant-jobs/in-Kuala-Lumpur"
  ],
  "maxListingsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/jobstreet-jobsdb-jobs --silent --output-dataset

```

## MCP server setup

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

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/5fiq41jSZWGteNijb/builds/MWD7hVSwBwxZm3Dbd/openapi.json
