# Seek Role Salaries, by Country, State and City (`gubidonius/seek-role-salaries`) Actor

Typical salary, median and range for 2,261 roles from the Seek, JobStreet and JobsDB career guides in seven markets, per country, state or major city, with tasks, skills and the open advert count. Per year in Australia and New Zealand, per month in Asia, and every row says which.

- **URL**: https://apify.com/gubidonius/seek-role-salaries.md
- **Developed by:** [Gregory Bolshakov](https://apify.com/gubidonius) (community)
- **Categories:** Jobs, Business, Lead generation
- **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 Role Salaries, by Country, State and City

The salary figures from the career guides on Seek in Australia and New Zealand, and on
JobStreet and JobsDB in Singapore, Malaysia, the Philippines, Hong Kong and Thailand. For
each of 2,261 roles: the typical band, the median and the range, for the country, for each
state or region, and for each major city or area. No key and no login.

### The unit changes with the market

Australia and New Zealand quote a typical salary per year. The five Asian markets quote it
per month. A retail sales associate is 70,000 to 80,000 AUD a year in Australia and 2,500 to
3,000 SGD a month in Singapore, and both are published as the guide states them, with
`salaryPeriod` and `currency` on every row. Nothing here converts between the two.

### What a row is

One role on one market in one place. The country row is always there, and `locationLevel`
adds a row per state or per major area when you want them. Every row carries
`locationType`, so a state's figure is never added to the country's by accident, and the
market's headline band beside its own figures, so a state row shows how far it sits from
the national one.

The row also carries the guide's one-line summary, the job family, the tasks, the skills,
similar roles, how many people in the role have reviewed it, and how many adverts the site
counted for the role title when the page was read.

### What the guide does not have

Indonesia has no career-advice pages. Some roles exist on one market and not another, and
the run lists each missing page rather than writing an empty row. Where a market publishes
no review count it writes minus one, which is published as null here.

### Billing

Two events: a start fee charged only once a row is returned, and a per-row fee charged after
each row is written. Roles the guide does not know cost nothing.

# Actor input Schema

## `roles` (type: `array`):

Role names or the slugs from the site's career-advice URLs, for example Retail Sales Associate, software-engineer, Registered Nurse. Every value is checked against the guide's own list of 2,261 roles, and a value it does not know is reported with the nearest real names rather than guessed. The roleId column of seek-jobs and the normalisedRoleTitle column of seek-job-details both work here.

## `allRoles` (type: `boolean`):

Read every released role instead of the list above, up to maxRoles. 2,221 roles were released on 10 September 2026, and each is one page per market.

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

Two-letter codes: AU, NZ, SG, MY, PH, HK, TH. Indonesia has no career-advice pages and is reported rather than read. Australia and New Zealand quote per year, the rest per month, and salaryPeriod on every row says which.

## `locationLevel` (type: `string`):

How fine to go. Australia has 8 states and 65 major areas, Singapore 5 regions and 60 areas, Hong Kong 3 regions and 18 districts. Every row carries locationType so the levels can be told apart.

## `maxRoles` (type: `integer`):

Most roles to read. Applied after the list is resolved, and to allRoles.

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

Most rows to return across all roles and markets together, and the most you will be charged for.

## Actor input object example

```json
{
  "roles": [
    "Software Engineer",
    "Registered Nurse"
  ],
  "allRoles": false,
  "markets": [
    "AU"
  ],
  "locationLevel": "country",
  "maxRoles": 50,
  "maxResults": 5000
}
```

# 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 = {
    "roles": [
        "Software Engineer",
        "Registered Nurse"
    ],
    "allRoles": false,
    "markets": [
        "AU"
    ],
    "locationLevel": "country",
    "maxRoles": 50,
    "maxResults": 5000
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/seek-role-salaries").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 = {
    "roles": [
        "Software Engineer",
        "Registered Nurse",
    ],
    "allRoles": False,
    "markets": ["AU"],
    "locationLevel": "country",
    "maxRoles": 50,
    "maxResults": 5000,
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/seek-role-salaries").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 '{
  "roles": [
    "Software Engineer",
    "Registered Nurse"
  ],
  "allRoles": false,
  "markets": [
    "AU"
  ],
  "locationLevel": "country",
  "maxRoles": 50,
  "maxResults": 5000
}' |
apify call gubidonius/seek-role-salaries --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gubidonius/seek-role-salaries"
        }
    }
}
```

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/Ea8LvNuLOh0SYx5kX/builds/cxalOzgqhBfNu52Sa/openapi.json
