# JobStreet, JobsDB & SEEK Jobs Scraper (8 countries) (`asiajobs/jobstreet-jobsdb-scraper`) Actor

Extract job postings from JobStreet (Malaysia, Singapore, Indonesia, Philippines), JobsDB (Thailand, Hong Kong) and SEEK (Australia, New Zealand) with one actor.

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

## Pricing

from $2.00 / 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.

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 & SEEK Jobs Scraper (8 countries)

Extract job postings from **JobStreet** (Malaysia, Singapore, Indonesia, Philippines), **JobsDB** (Thailand, Hong Kong) and **SEEK** (Australia, New Zealand) with one actor. All eight sites run on the same platform, so you get the same clean JSON for every country: title, company, location, category, work type, salary (with parsed min/max), listing date and the full job description.

### Supported sites

| `country` | Site |
|---|---|
| `TH` | th.jobsdb.com (JobsDB Thailand, หางาน) |
| `HK` | hk.jobsdb.com (JobsDB Hong Kong) |
| `MY` | my.jobstreet.com (JobStreet Malaysia) |
| `SG` | sg.jobstreet.com (JobStreet Singapore) |
| `ID` | id.jobstreet.com (JobStreet Indonesia, lowongan kerja) |
| `PH` | ph.jobstreet.com (JobStreet Philippines) |
| `AU` | seek.com.au (SEEK Australia) |
| `NZ` | seek.co.nz (SEEK New Zealand) |

### What you get

For every job posting:

| Field | Example |
|---|---|
| `title` | Registered Nurse in Aged Care |
| `companyName`, `advertiserId`, `companyProfileId` | Country Mile Home Care, 62473282, 3148442 |
| `location`, `locations` | Parramatta, Sydney NSW |
| `category`, `subCategory` | Healthcare & Medical, Nursing - Aged Care |
| `workTypes`, `workArrangements` | Full time; Hybrid / Remote / On-site |
| `salaryLabel` | $50 – $60 per hour (as shown on the site) |
| `salaryMin`, `salaryMax`, `salaryInterval`, `salaryCurrency` | 50, 60, hour, AUD (only when the employer shows a salary) |
| `teaser`, `bulletPoints` | short summary and the job's highlight bullets |
| `description`, `descriptionHtml` | full job description (with `includeDetails` on) |
| `status`, `listedAt`, `expiresAt` | Active, 2026-10-22T09:04:00Z, 2026-11-21T12:59:59Z |
| `tags`, `isFeatured` | Be an early applicant, Urgently hiring |
| `id`, `url`, `site`, `country`, `logoUrl`, `scrapedAt` | |

### Use cases

- **Recruiters & staffing agencies**: see who is hiring in Bangkok, Kuala Lumpur, Jakarta, Manila, Singapore, Hong Kong, Sydney or Auckland.
- **Salary & labor-market research**: salary ranges by category, location and work type across eight markets.
- **Sales lead generation**: companies that are hiring = companies that are growing.
- **Job aggregators & AI job agents**: feed fresh Asia-Pacific listings into your own product.

### How to use

1. Pick a `country` (default `TH`, JobsDB Thailand).
2. Optionally set a `keyword` (e.g. `accountant`, `data analyst`, `nurse`) and a `location` as you would type it on the site (e.g. `Bangkok`, `Kuala Lumpur`, `Sydney NSW`). Leave both empty to list all jobs.
3. Filter by `workTypes` (full time, part time, contract, casual) and `postedWithinDays`, choose a `sort` (newest first or relevance), set `maxItems` and run.
4. Export as JSON, CSV, Excel, or use the API.

Turn off `includeDetails` for a faster list without the full description (the teaser and bullet points are still included).

#### Only new jobs (incremental mode)

Set `onlyNewJobs: true` and run the same search on a schedule (e.g. daily). Each run returns only jobs that earlier runs of that search have not returned yet. You pay only for new jobs. With the default newest-first sort, the run also stops early once it reaches jobs it has already seen. The actor remembers up to 20,000 job ids per search in a key-value store named `jobstreet-jobsdb-seen` in your Apify account. Delete that store to start over. A "search" means the same country, keyword, location, work types and posted-within setting.

#### Example input

```json
{
  "country": "MY",
  "keyword": "accountant",
  "location": "Kuala Lumpur",
  "workTypes": ["242"],
  "postedWithinDays": 7,
  "maxItems": 200,
  "includeDetails": true
}
```

### Pricing

**$2 per 1,000 jobs** ($0.002 per job saved to the dataset), plus a tiny $0.00005 start fee per run. Platform usage (compute, proxy, storage) is included, so there are no surprise costs, and failed requests or empty searches cost only the start fee. Examples: 100 jobs cost $0.20, 10,000 jobs cost $20.

### Tips

- For a daily feed of **new** postings, schedule it with `onlyNewJobs: true` (or `postedWithinDays: 1`).
- `salaryLabel` is the employer's own text. `salaryMin`/`salaryMax` are filled only when it contains numbers; some employers write perks there instead.
- `salaryCurrency` is the site's local currency (THB, HKD, MYR, SGD, IDR, PHP, AUD, NZD).
- Use the Apify API or integrations (Google Sheets, Slack, Make, Zapier, n8n) to send new jobs anywhere.

### Notes

This actor reads publicly available job postings only. It does not log in, and it does not collect personal data about job seekers. Please use the data in line with applicable laws and the sites' terms.

Questions or a field you need? Open an issue on the actor page — fixes usually ship within a day.

# Actor input Schema

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

Which job site to search. All eight run on the same platform, so the output fields are the same.

## `keyword` (type: `string`):

Job title, skill or company, e.g. 'accountant', 'data analyst', 'nurse'. Leave empty to list all jobs.

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

Optional city, state or area as you would type it on the site, e.g. 'Bangkok', 'Kuala Lumpur', 'Sydney NSW'.

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

Only jobs of these work types. Leave empty for all.

## `postedWithinDays` (type: `integer`):

Only jobs listed in the last N days (e.g. 1 = today, 7 = last week). Leave empty for all.

## `sort` (type: `string`):

Sort order of the results.

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

Load the full description text of each job. Turn off for a faster list with the short teaser only.

## `onlyNewJobs` (type: `boolean`):

Skip jobs that earlier runs of this same search already returned, so scheduled runs return (and bill) only new postings. Seen job ids are kept in a key-value store named 'jobstreet-jobsdb-seen' in your account; delete it to start over.

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

Maximum number of jobs to return.

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

Proxy settings. The sites work without a proxy (the default); only change this if you see blocked requests.

## Actor input object example

```json
{
  "country": "TH",
  "keyword": "accountant",
  "sort": "ListedDate",
  "includeDetails": true,
  "onlyNewJobs": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped job postings (dataset items).

# 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 = {
    "keyword": "accountant"
};

// Run the Actor and wait for it to finish
const run = await client.actor("asiajobs/jobstreet-jobsdb-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 = { "keyword": "accountant" }

# Run the Actor and wait for it to finish
run = client.actor("asiajobs/jobstreet-jobsdb-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 '{
  "keyword": "accountant"
}' |
apify call asiajobs/jobstreet-jobsdb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,asiajobs/jobstreet-jobsdb-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/xgqR5IwckOKskroqQ/builds/j2ItHVAj3wLVlqB0A/openapi.json
