# SEEK, JobStreet & JobsDB Jobs Scraper (8 Countries) (`kirozhang/seek-jobstreet-jobsdb-scraper`) Actor

Scrape job listings from SEEK (Australia, New Zealand), JobStreet (Malaysia, Singapore, Philippines, Indonesia) and JobsDB (Hong Kong, Thailand) in one run: title, company, location, salary, work type, classification, date and full description.

- **URL**: https://apify.com/kirozhang/seek-jobstreet-jobsdb-scraper.md
- **Developed by:** [Kiro Zhang](https://apify.com/kirozhang) (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.

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

### What does SEEK, JobStreet & JobsDB Jobs Scraper do?

This Actor scrapes job listings from **all eight SEEK-group job boards in one run**:

| Board | Countries |
|---|---|
| [SEEK](https://www.seek.com.au) | 🇦🇺 Australia, 🇳🇿 New Zealand |
| [JobStreet](https://www.jobstreet.com) | 🇲🇾 Malaysia, 🇸🇬 Singapore, 🇵🇭 Philippines, 🇮🇩 Indonesia |
| [JobsDB](https://www.jobsdb.com) | 🇭🇰 Hong Kong, 🇹🇭 Thailand |

For every job you get the **title, company, location, salary, work type, work arrangement (remote/hybrid), classification, listing date, teaser and bullet points**, plus — optionally — the **full job description**, expiry date and verified-advertiser flag. Export to JSON, CSV or Excel, call it via API, schedule it daily, or plug it into Make, Zapier, n8n, Google Sheets or an AI agent.

### Why use this jobs scraper?

- 🌏 **8 countries, one Actor** — no need to maintain separate SEEK, JobStreet and JobsDB scrapers; results share one clean schema.
- 📈 **Beyond the 550-result limit** — the job boards stop paging after ~550 results per search. This Actor automatically splits large searches by classification and work type to collect up to **20,000 jobs per keyword**.
- 📝 **Full descriptions on demand** — clean text and original HTML; you only pay for descriptions that are returned.
- ⚡ **Fast and reliable** — uses the boards' own JSON search, no browser, no proxy needed for normal use. 100 jobs per request.
- 🧹 **Deduplicated** — the same job returned by several keywords or splits is saved once.

#### Use cases

- **Recruitment & staffing agencies** — find new roles and hiring companies every morning.
- **Job boards & aggregators** — feed fresh APAC jobs into your site.
- **Labour-market research** — salaries, demand by classification, remote-work trends across countries.
- **Sales / lead generation** — companies that are hiring are companies that are growing.
- **AI agents & RAG** — give assistants live job data.

### How to scrape SEEK, JobStreet and JobsDB

1. Click **Try for free** / **Start**.
2. Enter **search keywords** (e.g. `data analyst`, `registered nurse`) — or leave empty to scrape all jobs matching the filters.
3. Pick one or more **countries**, and optionally a **location**, **work type**, **classification** and **posted within**.
4. Set **Max jobs per keyword and country**.
5. Turn on **Include full job description** if you need the job ad text.
6. Run and download your data in JSON, CSV, Excel, XML or HTML.

### Input example

```json
{
    "searchTerms": ["data analyst", "accountant"],
    "countries": ["AU", "SG", "MY"],
    "location": "",
    "workTypes": ["fulltime"],
    "postedWithinDays": "7",
    "sortBy": "date",
    "maxJobsPerSearch": 500,
    "includeDescription": true
}
```

### Output example

```json
{
    "id": "94631714",
    "title": "Business Data Insights Analyst",
    "company": "Talent Corp",
    "location": "Hawthorn East, Melbourne VIC",
    "country": "AU",
    "site": "www.seek.com.au",
    "classification": "Information & Communication Technology",
    "subClassification": "Business/Systems Analysts",
    "workTypes": ["Full time"],
    "workArrangement": "Hybrid",
    "salary": "$700 - $800 per day",
    "currency": "AUD",
    "listedAt": "2026-09-15T01:26:05Z",
    "teaser": "Strong experience across SQL, Power BI and AI...",
    "bulletPoints": ["6 month contract + extensions", "Flexible working arrangements"],
    "isFeatured": false,
    "url": "https://www.seek.com.au/job/94631714",
    "description": "About the role ...",
    "expiresAt": "2026-10-15T12:59:59Z",
    "advertiserVerified": true
}
```

#### Data fields

| Field | Description |
|---|---|
| `id`, `url` | Job ID and link to the ad |
| `title`, `company`, `advertiserId` | Job title and hiring company / advertiser |
| `location`, `locations`, `country`, `site` | Where the job is and which board it came from |
| `classification`, `subClassification` | Industry and sub-category |
| `workTypes`, `workArrangement` | Full time / part time / contract / casual; on-site / hybrid / remote |
| `salary`, `currency` | Salary text when the advertiser shows it |
| `listedAt`, `listedAgo` | Listing date |
| `teaser`, `bulletPoints` | Short summary shown in search results |
| `isFeatured`, `adType`, `logoUrl` | Ad type and branding |
| `description`, `descriptionHtml`, `expiresAt`, `advertiserVerified` | With **Include full job description** |

### How much does it cost?

Simple pay-per-result pricing:

- **Job listing**: **$1.50 per 1,000 jobs**
- **Full description** (optional, only when returned): **+$1 per 1,000 jobs**

Example: 1,000 jobs with descriptions ≈ **$2.50**. Platform usage is included. Set *Maximum cost per run* to cap spending — the scraper stops cleanly at the limit. Apify's free monthly credits cover thousands of jobs.

### Tips

- Schedule a daily run with **Posted within: Last 24 hours** and **Sort by: Newest first** to get only new jobs.
- Location text works like on the website: `Sydney NSW`, `Melbourne VIC`, `Auckland`, `Kuala Lumpur`, `Makati City`, `Jakarta Raya`, `Central and Western District`, `Bangkok`.
- Leave keywords empty and choose a classification to export a whole category (e.g. all ICT jobs in Singapore).
- Salaries are shown only when the employer publishes them.

### FAQ

**Is it legal to scrape job listings?**
This Actor collects publicly available job advertisements. It does not collect personal data about job seekers and does not log in. You are responsible for complying with applicable laws and the websites' terms when using the data.

**Why do I get fewer jobs than the site's total count?**
Totals shown by the boards are estimates, and duplicates across splits are removed. Use broader keywords or fewer filters to get more.

**Need another job board or a custom feed?**
Open an issue in the **Issues** tab — we check it regularly.

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles, skills or companies, e.g. "data analyst", "nurse", "react developer". Leave empty to scrape all jobs matching the filters.

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

SEEK (Australia, New Zealand), JobStreet (Malaysia, Singapore, Philippines, Indonesia) and JobsDB (Hong Kong, Thailand). Each keyword runs on every selected board.

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

Optional city, state or suburb as you would type it on the site, e.g. "Sydney NSW", "Auckland", "Kuala Lumpur", "Makati City".

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

Optional work type filter.

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

Optional industry / classification filter.

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

Only jobs listed within this many days.

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

Order of results.

## `maxJobsPerSearch` (type: `integer`):

The job boards stop paging after ~550 results; above that the scraper automatically splits the search by classification and work type to collect up to 20,000 jobs.

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

Fetch the full job ad (HTML + clean text), expiry date and verified-advertiser flag for every job. Charged as an extra event only when the description is returned.

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

Usually not needed. Enable Apify Proxy if you run very large jobs and get rate limited.

## Actor input object example

```json
{
  "searchTerms": [
    "data analyst"
  ],
  "countries": [
    "AU"
  ],
  "workTypes": [],
  "classifications": [],
  "postedWithinDays": "0",
  "sortBy": "relevance",
  "maxJobsPerSearch": 50,
  "includeDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `jobs` (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 = {
    "searchTerms": [
        "data analyst"
    ],
    "countries": [
        "AU"
    ],
    "maxJobsPerSearch": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("kirozhang/seek-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 = {
    "searchTerms": ["data analyst"],
    "countries": ["AU"],
    "maxJobsPerSearch": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("kirozhang/seek-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 '{
  "searchTerms": [
    "data analyst"
  ],
  "countries": [
    "AU"
  ],
  "maxJobsPerSearch": 50
}' |
apify call kirozhang/seek-jobstreet-jobsdb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kirozhang/seek-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/yaKLgqIbBm6Ul4Sty/builds/xJo2IX6LV2gGEJEBI/openapi.json
