# Seek Jobs, Past the 550 Result Ceiling (`gubidonius/seek-jobs`) Actor

Job adverts from Seek, JobStreet and JobsDB across Australia, New Zealand, Singapore, Malaysia, the Philippines, Indonesia, Hong Kong and Thailand. The search stops at row 550 and reports the page after it as a search matching nothing. This one cuts the search up and measures the cover.

- **URL**: https://apify.com/gubidonius/seek-jobs.md
- **Developed by:** [Gregory Bolshakov](https://apify.com/gubidonius) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

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

## Seek Jobs, Past the 550 Result Ceiling

Job adverts from Seek in Australia and New Zealand, and from JobStreet and JobsDB in Singapore,
Malaysia, the Philippines, Indonesia, Hong Kong and Thailand. One search, eight markets, no key
and no login.

### The page that lies

The search serves rows 1 to 550 of any query and no more. Ask for row 551 and it answers HTTP
200 with an empty list and a total of zero, which is exactly what a search matching nothing
looks like. A nursing search in Sydney reported 1,398 adverts on 10 September 2026.

This Actor never asks for that page. The whole search is walked first in the site's own order,
so a small row budget gives you what the site would show you. A search past the ceiling is
then cut into cells on classification, work type, arrangement and salary band until each fits,
with the counts read inside each cell rather than guessed.

### The total is not a count of adverts

Every sponsored slot is a second copy of an advert that is also in the organic list. An
actuary search reported 372, served 372 rows, and 347 of them were different adverts. The
other 25 were the 25 sponsored slots. This Actor writes each advert once, charges it once, and
marks it `isPromoted`. Every row carries `searchTotalReported` so you can see the two numbers
side by side.

### Salary

The site publishes salary as free text. `salaryMin` and `salaryMax` are read from it only when
there is a figure, and `salaryPeriod` comes from the label's own words. Australia quotes per
year or per hour, the Asian markets per month, and nothing here converts between them.

### What a run admits

`RUN_SUMMARY` in the key-value store holds every cell with what it reported, what it returned
and why it stopped, plus `complete`, `limitedBy`, `duplicatesSuppressed` and any filter value
the site does not use.

### Billing

Two events: a start fee charged only once adverts are returned, and a per-advert fee charged
after each advert is written. A run that matches nothing costs nothing.

# Actor input Schema

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

Words to search advert titles and text for, as you would type them on the site. Leave it empty to walk a whole classification or a whole market.

## `markets` (type: `array`):

Two-letter codes for the storefronts to search: AU and NZ are Seek, SG, MY, PH and ID are JobStreet, HK and TH are JobsDB. Each is searched in turn and the row budget is shared across them.

## `where` (type: `string`):

A place as the site writes it, for example Sydney NSW, All Melbourne VIC, Queensland, Auckland, Singapore, Kuala Lumpur. The site matches it loosely and picks the nearest place it knows, so check locationRegion on the rows that come back.

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

The 30 top-level job families, by name or id, for example Information & Communication Technology, Healthcare & Medical, 6281. Every value is checked against the live taxonomy before the search runs, and a value the site does not use abandons the run rather than widening it.

## `subclassifications` (type: `array`):

The 394 narrower categories, by name or id, for example Engineering - Software, Nursing - Aged Care, 6290. The parent classification is added for you, because the site ignores a subclassification given on its own.

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

One or more of full-time, part-time, contract, casual.

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

One or more of on-site, hybrid, remote. Most adverts state none, and those are matched by on-site.

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

Lowest salary to match, in the market's own currency and in the unit named by salaryType. The site applies this to the salary range every employer must give it privately, so adverts that print no salary still match.

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

Highest salary to match, same unit. 0 means no ceiling.

## `salaryType` (type: `string`):

The unit salaryMin and salaryMax are in. Australia and New Zealand quote per year, the six Asian markets per month.

## `listedWithinDays` (type: `integer`):

Only adverts listed in the last 1, 3, 7, 14 or 31 days. These are the only values the site filters on, and any other number abandons the run. 0 means no date filter.

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

Order within each cell of the search. Newest first is the one to use for a change feed.

## `maxResults` (type: `integer`):

Most adverts to return across all markets together, and the most you will be charged for. Duplicates never count against it.

## Actor input object example

```json
{
  "keywords": "data engineer",
  "markets": [
    "AU"
  ],
  "where": "",
  "classifications": [],
  "subclassifications": [],
  "workTypes": [],
  "workArrangements": [],
  "salaryMin": 0,
  "salaryMax": 0,
  "salaryType": "annual",
  "listedWithinDays": 0,
  "sortBy": "relevance",
  "maxResults": 100
}
```

# 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 = {
    "keywords": "data engineer",
    "markets": [
        "AU"
    ],
    "where": "",
    "classifications": [],
    "subclassifications": [],
    "workTypes": [],
    "workArrangements": [],
    "salaryMin": 0,
    "salaryMax": 0,
    "salaryType": "annual",
    "listedWithinDays": 0,
    "sortBy": "relevance",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/seek-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 = {
    "keywords": "data engineer",
    "markets": ["AU"],
    "where": "",
    "classifications": [],
    "subclassifications": [],
    "workTypes": [],
    "workArrangements": [],
    "salaryMin": 0,
    "salaryMax": 0,
    "salaryType": "annual",
    "listedWithinDays": 0,
    "sortBy": "relevance",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/seek-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 '{
  "keywords": "data engineer",
  "markets": [
    "AU"
  ],
  "where": "",
  "classifications": [],
  "subclassifications": [],
  "workTypes": [],
  "workArrangements": [],
  "salaryMin": 0,
  "salaryMax": 0,
  "salaryType": "annual",
  "listedWithinDays": 0,
  "sortBy": "relevance",
  "maxResults": 100
}' |
apify call gubidonius/seek-jobs --silent --output-dataset

```

## MCP server setup

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