# Asia Job Listings Scraper — JobStreet & JobsDB (SEEK) (`jungle_synthesizer/jobstreet-jobsdb-seek-asia-job-listing-scraper`) Actor

Job postings across Malaysia, Singapore, the Philippines, Indonesia, Hong Kong and Thailand — sourced from JobStreet and JobsDB (SEEK Asia). Get titles, companies, salaries, locations, classifications and full descriptions in one dataset.

- **URL**: https://apify.com/jungle\_synthesizer/jobstreet-jobsdb-seek-asia-job-listing-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (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 $0.80 / 1,000 record scrapeds

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/platform/actors/running/actors-in-store#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

## Asia Job Listings Scraper — JobStreet & JobsDB (SEEK)

Scrape job postings from JobStreet and JobsDB, the SEEK Asia network covering Malaysia, Singapore, the Philippines, Indonesia, Hong Kong and Thailand. Returns titles, companies, salaries, locations, classifications and full job descriptions across all six country properties in one normalised dataset.

***

### Asia Job Listings Scraper Features

- Covers all six SEEK Asia properties in one run — Malaysia, Singapore, the Philippines and Indonesia's JobStreet, plus Hong Kong and Thailand's JobsDB
- Filters by keyword and location per run, or leave both blank for the unfiltered listing index
- Parses raw salary text into structured min/max/currency/period — no regex required on your end
- Returns full HTML job descriptions and company review ratings, with a toggle to skip that step for faster, lighter runs
- Flags listings the source platform marks as expiring soon, so you know which records are about to disappear

***

### Who Uses JobStreet and JobsDB Data?

- **Recruitment agencies** — track competitor postings and salary ranges across Southeast Asian markets in one feed
- **Salary benchmarking vendors** — build compensation datasets from real, currently-live postings instead of surveys
- **Market-entry researchers** — see which companies are hiring, where, and for what roles before entering a new country
- **HR tech platforms** — feed structured job data into aggregators, alert systems or matching tools
- **Job boards and aggregators** — mirror SEEK Asia listings into your own index without building six separate scrapers

***

### How Asia Job Listings Scraper Works

1. Pick which of the six country properties to crawl (or leave the default — all of them) and an optional keyword or location filter.
2. The scraper pages through each country's listing index and normalises every record into a single schema, with a `country` field so you can tell them apart.
3. For each listing, it optionally fetches the full job description and the advertiser's company review rating — this is on by default and can be switched off if you just want the listing-level fields.
4. Results land in your dataset as they're found, so you can start using early records before a large run finishes.

***

### Input

```json
{
  "countries": ["my", "sg"],
  "keywords": "software engineer",
  "location": "Kuala Lumpur",
  "includeFullDetails": true,
  "maxItems": 100
}
```

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `countries` | array | all six | Country properties to crawl: `my`, `sg`, `ph`, `id`, `hk`, `th`. Leave empty to crawl all six. |
| `keywords` | string | *(none)* | Job title or keyword search. Leave empty to crawl the unfiltered listing index. |
| `location` | string | *(none)* | Free-text location/area filter within the chosen countries. |
| `includeFullDetails` | boolean | `true` | Fetch each listing's detail page for the full description and company review rating. Disable for a faster, lighter run with listing-only fields. |
| `maxItems` | integer | 10 | Maximum number of records to scrape, across all selected countries combined. |

***

### Asia Job Listings Scraper Output Fields

```json
{
  "job_id": "93868260",
  "country": "my",
  "source_domain": "my.jobstreet.com",
  "title": "Graduate Engineer / Junior Project Engineer",
  "company_name": "NEXGEN AI CAPITALS",
  "company_id": "63700845",
  "company_review_rating": null,
  "location": "Setia Alam, Selangor",
  "area": "Selangor",
  "classification": "Engineering",
  "sub_classification": "Project Engineering",
  "work_type": "Full time",
  "work_arrangement": "On-site",
  "salary_text": "RM 3,000 – RM 3,500 per month",
  "salary_min": 3000,
  "salary_max": 3500,
  "salary_currency": "MYR",
  "salary_period": "month",
  "teaser": "Seeking a fresh Engineering graduate to support project coordination, site activities, technical documentation and engineering works.",
  "description_html": "<p>We are looking for a motivated Graduate Project Engineer...</p>",
  "bullet_points": [],
  "listing_date": "2026-08-10T03:58:00Z",
  "is_expiring_soon": false,
  "job_url": "https://my.jobstreet.com/job/93868260",
  "scraped_at": "2026-08-10T05:53:24.083Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `job_id` | string | SEEK-native job listing ID |
| `country` | string | Country property this listing was crawled from (`my`, `sg`, `ph`, `id`, `hk`, `th`) |
| `source_domain` | string | Source domain (e.g. `my.jobstreet.com`, `hk.jobsdb.com`) |
| `title` | string | Job title |
| `company_name` | string | Hiring company or advertiser name |
| `company_id` | string | SEEK-native advertiser/employer ID |
| `company_review_rating` | number | Aggregate company review rating out of 5, when the advertiser has a public company profile (`null` otherwise) |
| `location` | string | Full job location label |
| `area` | string | Broader region/state containing the job location |
| `classification` | string | Top-level job classification/category |
| `sub_classification` | string | Job sub-classification |
| `work_type` | string | Full time / part time / contract / casual |
| `work_arrangement` | string | On-site / hybrid / remote |
| `salary_text` | string | Raw salary label as published (e.g. "RM 3,500 – RM 4,100 per month") |
| `salary_min` | number | Parsed minimum salary, in `salary_currency` units per `salary_period` |
| `salary_max` | number | Parsed maximum salary, in `salary_currency` units per `salary_period` |
| `salary_currency` | string | ISO currency code for the country property (MYR, SGD, PHP, IDR, HKD, THB) |
| `salary_period` | string | Pay period: hour, day, week, month or year |
| `teaser` | string | Short listing preview text |
| `description_html` | string | Full job description as HTML, from the listing detail page (populated when `includeFullDetails` is enabled) |
| `bullet_points` | array | Highlight bullet points from the listing, when the advertiser included them |
| `listing_date` | datetime | ISO-8601 timestamp the listing was posted |
| `is_expiring_soon` | boolean | True if the source platform flags this listing as expiring soon |
| `job_url` | string | Canonical URL for this job listing |
| `scraped_at` | datetime | ISO-8601 timestamp when this record was scraped |

***

### FAQ

#### How do I scrape JobStreet or JobsDB job listings?

Asia Job Listings Scraper needs no account or API key. Pick the countries you want — or leave the default, which is all six — add an optional keyword or location filter, and run it. You get back structured records, not raw HTML.

#### What countries does this cover?

All six SEEK Asia properties: Malaysia and Singapore's JobStreet, the Philippines and Indonesia's JobStreet, and Hong Kong and Thailand's JobsDB. One schema, one `country` field, no need to run six separate scrapers.

#### Can I filter by job title or location?

Yes. Set `keywords` for a title/skill search and `location` for a free-text area filter — both apply across every country you selected. Leave them blank to pull the unfiltered listing index.

#### Does the output include the full job description?

Yes, by default. Each listing's detail page is fetched for the full HTML description and, when available, the advertiser's company review rating. Turn `includeFullDetails` off if you only need the listing-level fields and want a faster run.

#### How much does Asia Job Listings Scraper cost to run?

Pricing is per record returned. Check the Pricing tab on the Actor page for the current rate — there's no separate charge for the detail-page enrichment.

***

### Need More Features?

Need custom fields, a different filter, or another SEEK market? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use Asia Job Listings Scraper?

- **Full network coverage** — one actor for all six SEEK Asia country properties, not six separate single-country scrapers.
- **Structured salary data** — raw labels like "Rp 4.000.000 – Rp 6.000.000 per month" come back parsed into min, max, currency and period, so you're not writing per-country regex.
- **Optional deep enrichment** — full descriptions and company ratings when you want them, listing-only speed when you don't.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

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

Maximum number of records to scrape

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

SEEK Asia country properties to crawl. Leave empty to crawl all six.

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

Job title or keyword search (e.g. "software engineer"). Leave empty to crawl the unfiltered listing index.

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

Free-text location/area filter within the chosen countries (e.g. "Kuala Lumpur"). Leave empty for all locations.

## `includeFullDetails` (type: `boolean`):

Fetch each listing's detail page for the full description, and company review rating. Disable for a faster, lighter run with listing-only fields.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "countries": [
    "my",
    "sg",
    "ph",
    "id",
    "hk",
    "th"
  ],
  "includeFullDetails": true
}
```

# Actor output Schema

## `results` (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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
    "includeFullDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/jobstreet-jobsdb-seek-asia-job-listing-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
    "includeFullDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/jobstreet-jobsdb-seek-asia-job-listing-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "includeFullDetails": true
}' |
apify call jungle_synthesizer/jobstreet-jobsdb-seek-asia-job-listing-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/jobstreet-jobsdb-seek-asia-job-listing-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/DynRTf6UAFMUM5wJz/builds/WhtatfkewBYbJL2U6/openapi.json
