# SEEK Jobs Scraper - Cheapest, Australia & NZ (`dami_studio/seek-jobs-scraper`) Actor

The cheapest SEEK scraper on Apify - $0.81 per 1,000 jobs, and the only one covering Australia AND New Zealand with salary ranges. Titles, companies, salary bands, remote/hybrid/onsite, employment type, dates and full descriptions. No login or API key. Over 1,000 jobs in one run.

- **URL**: https://apify.com/dami\_studio/seek-jobs-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Jobs, Lead generation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.81 / 1,000 seek 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/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

## SEEK Jobs Scraper — Australia **and** New Zealand, with salary data

**The complete SEEK dataset for both markets — including the salary ranges most scrapers cannot
extract.** One run returns over 1,000 matching jobs.

Search any keyword or location and get titles, companies, salary bands, workplace type
(remote / hybrid / onsite), employment type, posting dates and full descriptions from
`seek.com.au` **and** `seek.co.nz`. **No login, no cookies, no API key.**

### Who uses this

- **Recruitment agencies** pricing roles against live market salary bands.
- **Job boards** aggregating ANZ listings automatically.
- **Analysts and researchers** tracking hiring demand across Australia and New Zealand.
- **Relocation and migration services** matching candidates to sponsored roles.

### Why this one

| | This Actor | Typical alternative |
|---|---|---|
| Countries | **AU + NZ** | Usually one |
| Salary bands | **Extracted** | Often missing |
| Workplace type | **Remote / hybrid / onsite** | Rarely parsed |
| Login required | **Never** | Sometimes |
| Charged on failure | **No** | Varies |

### Frequently asked questions

**Do I need a SEEK account or API key?** No. A keyword is enough.

**Does it cover New Zealand as well as Australia?** Yes — set `site` to `AU` or `NZ`.

**Can I get salary information?** Yes. Salary text plus parsed `salaryMin` / `salaryMax` where SEEK
publishes it, and you can filter with `salaryMin`.

**Am I charged if nothing matches?** You are not charged the per-result fee - only the $0.001 run-start fee. No-result and blocked runs return uncharged diagnostics.

**How many jobs can one run return?** Over 1,000 for a broad keyword; use `maxItems` to cap it.

### What it returns

Each successful job row includes the SEEK job ID, title, company, locations, workplace type, employment type, salary label and parsed salary values, listing date, teaser, bullet points, canonical URL, source, and charge state. Enable **Fetch descriptions** to request the public job page and add description and structured JobPosting fields. Details are best-effort: a listing row remains useful when an employer page changes or is unavailable.

### Input examples

Search Australia:

```json
{
  "site": "AU",
  "keywords": "software engineer",
  "location": "Sydney",
  "maxItems": 50,
  "maxPages": 3,
  "includeDetails": false
}
```

Search New Zealand for recent remote roles:

```json
{
  "site": "NZ",
  "keywords": "data analyst",
  "location": "Auckland",
  "workplaceTypes": ["Remote"],
  "datePosted": "7days",
  "maxItems": 100
}
```

Direct jobs can be supplied with `jobIds` or public `jobUrls`. Direct requests are deduplicated with search results.

### Network and proxy behavior

The actor always starts with a direct request. It uses the configured residential Apify proxy only after SEEK responds with a block or rate-limit status, and limits rotations with `maxProxyRetries`. This keeps ordinary runs inexpensive while retaining a recovery path for traffic shaping. Proxy bandwidth is an external variable and can dominate cost when descriptions are enabled or a search requires multiple rotations. For predictable economics, begin with `includeDetails: false`, modest `maxPages`, and a small `maxItems` value.

Blocked and empty searches produce an uncharged diagnostic row. An empty input produces a labeled uncharged sample row so automated actor tests can validate the output contract without SEEK traffic.

### Pricing event

Successful job rows use the `job` pay-per-event event. Diagnostics, samples, and failed requests are never charged.

### Privacy and limits

This actor reads public SEEK pages and does not require credentials. Users are responsible for complying with SEEK terms, applicable law, and reasonable request rates. Do not submit private or authenticated URLs.

### Billing

Two charges apply: a **$0.001 run-start fee** each time a run begins, and the per-result fee for results actually delivered. Samples, diagnostics, duplicates, blocked look-ups and no-result runs **never incur the per-result fee** — a run that returns nothing costs only the $0.001 start fee.

# Actor input Schema

## `site` (type: `string`):

Search SEEK Australia or New Zealand.

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

Job title or search terms, for example software engineer or registered nurse.

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

City, region, or country. Leave blank for all locations.

## `jobUrls` (type: `array`):

Public SEEK job URLs to fetch directly. Direct URLs are deduplicated with search results.

## `jobIds` (type: `array`):

SEEK numeric job IDs to fetch directly.

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

Maximum unique job records returned.

## `maxPages` (type: `integer`):

Maximum pages to request. SEEK normally returns up to 22 jobs per page.

## `datePosted` (type: `string`):

Optional client-side age filter.

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

Optional client-side employment type filters, such as Full time or Contract/temp.

## `workplaceTypes` (type: `array`):

Optional client-side workplace filters: Remote, Hybrid, or On-site.

## `salaryMin` (type: `number`):

Optional minimum numeric salary filter when SEEK exposes salary data.

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

Fetch each job page and add description, requirements, and structured metadata. This uses more requests.

## `useResidentialFallback` (type: `boolean`):

Allow residential proxy retries only after a direct request is blocked or rate-limited. Proxy usage can materially increase cost.

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

Apify proxy configuration used only for blocked direct requests. Residential is recommended for fallback.

## `maxProxyRetries` (type: `integer`):

Maximum fresh residential sessions across the run after direct requests are blocked.

## Actor input object example

```json
{
  "site": "AU",
  "keywords": "software engineer",
  "location": "Sydney",
  "maxItems": 50,
  "maxPages": 5,
  "datePosted": "any",
  "includeDetails": false,
  "useResidentialFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxProxyRetries": 2
}
```

# Actor output Schema

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

Results in the default dataset.

# 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": "software engineer",
    "location": "Sydney"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/seek-jobs-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 = {
    "keywords": "software engineer",
    "location": "Sydney",
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/seek-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "software engineer",
  "location": "Sydney"
}' |
apify call dami_studio/seek-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dami_studio/seek-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/efRl3kJaZLuK7OYAL/builds/vYbBndLYZwWw7B9Wa/openapi.json
