# SEEK Scraper | Australia & NZ Job Listings with Salary (`haketa/seek-scraper`) Actor

SEEK job scraper & API for Australia & New Zealand: search jobs by keyword, location & category and export title, company, salary, work type, classification, posting date, description and apply URL. Recruitment, salary benchmarking and job-board market data — fast, no login.

- **URL**: https://apify.com/haketa/seek-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 99 total users, 6 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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/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

## SEEK Jobs Scraper — Australia & New Zealand Job Listings, Salary, Superannuation & Visa Sponsorship

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-0066CC?logo=apify\&logoColor=white)](https://apify.com/haketa/seek-scraper)
[![Region](https://img.shields.io/badge/Markets-Australia%20%F0%9F%87%A6%F0%9F%87%BA%20seek.com.au%20%7C%20New%20Zealand%20%F0%9F%87%B3%F0%9F%87%BF%20seek.co.nz-0A66C2)]()
[![Fields](https://img.shields.io/badge/Fields-30%20Structured%20HR%20%26%20Salary%20Attributes-2EA44F)]()
[![Scale](https://img.shields.io/badge/Scale-1%2C000%2B%20Jobs%20Auto--Expansion-orange)]()
[![Auth](https://img.shields.io/badge/Auth-No%20Login%20Required-success)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-blueviolet)]()

**Extract live job postings from [seek.com.au](https://www.seek.com.au) (Australia) and [seek.co.nz](https://www.seek.co.nz) (New Zealand) with structured salary bounds, superannuation detection (`plus super` vs `inc super`), visa sponsorship classification (`482`/`TSS`/`186`), work arrangement (`On-site`/`Hybrid`/`Remote`), and industry taxonomy.**

This **SEEK scraper** converts unstructured ANZ job advertisements into clean, normalized records — capturing **job ID, title, hiring company, company logo & profile URL, parsed city/state/postcode, classification & sub-classification, work type, work arrangement, numeric `salaryMin` & `salaryMax`, `salaryPeriod`, `salaryHasSuper`, `visaSponsorship`, bullet points, teaser, full job description, required skills, posting timestamp, and direct listing URL**.

Export to **JSON, CSV, Excel (XLSX), XML, or the Apify API** with no SEEK account or login required.

> Built for ANZ recruitment agencies, talent-intelligence & RPO teams, compensation & remuneration analysts, registered migration agents (`Subclass 482/186`), B2B sales teams tracking hiring intent, and labor-market researchers.

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Supported Markets** | 🇦🇺 Australia (`seek.com.au`) and 🇳🇿 New Zealand (`seek.co.nz`) |
| **Search & Input Modes** | Keyword(s) + city/state dropdown (26 pre-mapped ANZ regions), custom location text (`locationCustom`), or direct `startUrls` |
| **Built-In Filters** | Work type (`full-time`, `part-time`, `contract`, `casual`), work arrangement (`onsite`, `hybrid`, `remote`), date posted (`1`, `3`, `7`, `14`, `31` days) |
| **Salary Intelligence** | Parses free-form pay strings into numeric `salaryMin`, `salaryMax`, `salaryPeriod` (`annual`, `daily`, `hourly`, `monthly`), and `salaryHasSuper` (`true`/`false`/`null`) |
| **Visa Sponsorship Engine** | 3-tier classification (`explicit_sponsorship`, `open_to_sponsorship`, `no_sponsorship`) detecting Subclass 482, TSS, 186, ENS, PR pathways, and citizenship requirements |
| **Detail Enrichment** | Optional `scrapeDetails: true` visits each job page for full `description`, `skills` array, and description-level salary & visa recovery |
| **Pagination & 1K+ Scale** | Automatic multi-page traversal with regional & sort-mode auto-expansion to overcome SEEK's ~550-per-query limit and collect **1,000+ unique jobs** per run |
| **Empty-Input Behavior** | Running with `{}` returns a fast 100-job sample across Australia |
| **Export Formats** | JSON, JSONL, CSV, Excel (XLSX), HTML, XML, RSS, and Apify REST API |

***

### 🔎 Why scrape SEEK (Australia & New Zealand)?

**SEEK** is the #1 employment marketplace in Australia and New Zealand, hosting hundreds of thousands of active job ads across every metro (`Sydney`, `Melbourne`, `Brisbane`, `Perth`, `Adelaide`, `Canberra`, `Auckland`, `Wellington`, `Christchurch`), regional hub, and industry classification.

However, extracting actionable intelligence from SEEK manually is challenging:

- **Free-form compensation strings:** Employers write salaries as `"$130k - $160k + super"`, `"$950 - $1,100 per day inc. super"`, or bury the package inside the job body.
- **Superannuation ambiguity:** In Australia, the Superannuation Guarantee (SG) adds 11.5%+ to base pay. Comparing `"$140k + super"` against `"$140k package"` without a structured `salaryHasSuper` flag skews salary benchmarks.
- **Hidden visa sponsorship signals:** Employers rarely have a dedicated filter for Subclass 482 (TSS) or 186 (ENS) sponsorship — instead, sponsorship willingness is mentioned inside bullet points or the full job description.
- **550-result search cap:** SEEK caps any single search query at ~25 pages (~550 jobs).

This **SEEK scraper** solves every one of those challenges automatically — normalizing salaries, flagging superannuation, classifying visa sponsorship, and auto-expanding across regions and sort modes when you request **1,000+ jobs**.

#### Key business benefits

1. **B2B hiring-signal lead generation:** Identify Australian and New Zealand companies actively hiring for roles that buy or use your product (e.g. `DevOps Engineer`, `Payroll Manager`, `Safety Officer`, `Fleet Manager`) and enrich your outbound CRM daily.
2. **Real-time ANZ salary & super benchmarking:** Build accurate compensation percentiles by `classification`, `subClassification`, `state`, and `workType` with numeric `salaryMin` / `salaryMax`.
3. **Skilled migration & Subclass 482/186 employer mapping:** Filter `visaSponsorship: "explicit_sponsorship"` or `"open_to_sponsorship"` to build verified lists of visa-sponsoring employers in healthcare, engineering, ICT, trades, and construction.
4. **Competitor headcount & expansion tracking:** Monitor where enterprises and high-growth startups are expanding across NSW, VIC, QLD, WA, SA, and NZ.

***

### ✨ Key features

- ✅ **Australia (`seek.com.au`) & New Zealand (`seek.co.nz`) support:** Switch countries with a single dropdown (`country: "au"` or `"nz"`).
- ✅ **26 pre-configured ANZ metro & state locations + custom location support:** Select Sydney, Melbourne, Brisbane, Perth, Adelaide, Canberra, Gold Coast, Newcastle, Sunshine Coast, Hobart, Darwin, Wollongong, any Australian state, or Auckland, Wellington, Canterbury, Waikato, Otago, and Bay of Plenty — or type any town into `locationCustom`.
- ✅ **Unlocked 1,000+ job pagination:** Supports comma-separated keywords in `keyword` and automatically expands across regional and `ListedDate` facets whenever `maxRecords > 400` (or `0` unlimited), seamlessly bypassing SEEK's ~550-result single-search ceiling while deduplicating by `jobId`.
- ✅ **Numeric salary & superannuation parser:** Handles `$120k–$150k`, `$130 - 160k`, hourly/daily rates, and SEEK's `$133348.0k` formatting quirks. When `scrapeDetails: true` is enabled, it also extracts salary ranges written inside the full job description when the search card has none.
- ✅ **3-tier visa sponsorship detector:** Scans teasers, bullet points, and (with `scrapeDetails: true`) full descriptions to tag roles as:
  - `explicit_sponsorship` (`482 visa`, `TSS visa`, `186 visa`, `ENS nomination`, `sponsorship available`)
  - `open_to_sponsorship` (`sponsorship considered`, `overseas candidates welcome`, `PR pathway`)
  - `no_sponsorship` (`Australian citizens only`, `must have full working rights`, `no sponsorship`)
- ✅ **Resilient session rotation:** Automatically rotates residential proxy sessions on rate limits so deep multi-hundred-page runs finish cleanly.

***

### 🎯 Use cases

#### 1. Recruitment agency & RPO BD (Business Development)

Staffing agencies scrape daily postings (`dateRange: "1"` or `"3"`) in their target vertical (`Information & Communication Technology`, `Healthcare & Medical`, `Mining, Resources & Energy`, `Accounting`), filter out competing recruitment agencies, and pitch hiring managers who have open requisitions.

#### 2. Remuneration & HR analytics

People-analytics teams pull 1,000+ listings per role family across Sydney, Melbourne, Brisbane, and Perth to compare base + super packages, remote/hybrid ratios (`workArrangement`), and contract day rates vs permanent salaries.

#### 3. Immigration & relocation advisory

Migration agents and international job boards run the scraper with `scrapeDetails: true` across high-demand ANZSCO occupations (Registered Nurses, Civil Engineers, Software Engineers, Chefs, Mechanics) to curate live feeds of `explicit_sponsorship` jobs.

#### 4. Job board & newsletter aggregation

Niche community job boards and industry newsletters schedule automated daily pulls, feeding clean JSON/CSV records with `title`, `company`, `companyLogo`, `salaryRaw`, `location`, and `listingUrl` directly into Webflow, WordPress, or Supabase.

***

### 📥 Input parameters

All parameters are optional. Leaving inputs at their defaults runs a fast 100-job search on `seek.com.au`.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `country` | `string` | `"au"` | Target SEEK site: `"au"` (`seek.com.au` Australia) or `"nz"` (`seek.co.nz` New Zealand). |
| `keyword` | `string` | `""` (prefill `"software engineer"`) | Job title, skill, or keyword(s). Supports comma-separated terms (e.g. `"software engineer, data engineer, devops"`) to sweep multiple roles in one run. |
| `location` | `string` | `""` (All locations) | Dropdown of 26 major Australian & New Zealand cities, regions, and states (`all-sydney-nsw`, `all-melbourne-vic`, `all-brisbane-qld`, `all-auckland`, etc.). |
| `locationCustom` | `string` | `""` | Optional free-text location (e.g. `"Cairns QLD"`, `"Geelong VIC"`, `"Christchurch"`) used when `location` is set to `"All locations"`. |
| `workType` | `string` | `"all"` | Employment type: `"all"`, `"full-time"`, `"part-time"`, `"contract"`, or `"casual"`. |
| `workArrangement` | `string` | `"all"` | Workplace model: `"all"`, `"onsite"`, `"hybrid"`, or `"remote"`. |
| `dateRange` | `string` | `"0"` | Posted within: `"0"` (Any time), `"1"` (24h), `"3"` (3 days), `"7"` (7 days), `"14"` (14 days), or `"31"` (30 days). |
| `scrapeDetails` | `boolean` | `false` | Visit each job detail page to extract full `description`, `skills`, and description-level salary & visa sponsorship signals. Keep `false` for fast bulk runs. |
| `maxRecords` | `integer` | `0` (prefill `100`) | Maximum total jobs to collect. Set `0` for unlimited, or `1000`+ for deep multi-region collection. |
| `maxPages` | `integer` | `0` | Optional page cap per search URL (~22 jobs/page). Leave at `0` (unlimited) so `maxRecords` governs run size. |
| `requestDelay` | `integer` | `1000` | Delay between page requests in milliseconds (`500`–`10000`). |
| `startUrls` | `array` | `[]` | Optional list of ready-made SEEK search URLs. Overrides keyword/location menus when provided. |
| `proxyConfiguration` | `object` | AU Residential | Apify Proxy configuration. **Keep `RESIDENTIAL` enabled** and match the country (`"AU"` or `"NZ"`) to your target SEEK domain. |

#### Example input — 1,000+ Australian tech jobs across all capitals

```json
{
  "country": "au",
  "keyword": "software engineer, data engineer, cloud engineer",
  "location": "",
  "workType": "all",
  "dateRange": "14",
  "scrapeDetails": false,
  "maxRecords": 1000,
  "maxPages": 0,
  "requestDelay": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "AU"
  }
}
```

#### Example input — Sydney full-time roles with full descriptions & visa detection

```json
{
  "country": "au",
  "keyword": "registered nurse",
  "location": "all-sydney-nsw",
  "workType": "full-time",
  "dateRange": "7",
  "scrapeDetails": true,
  "maxRecords": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "AU"
  }
}
```

***

### 📤 Output schema & field reference

Every job listing is returned as a structured JSON object with 30 normalized fields.

#### 💼 Job Identity, Company & Classification

| Field | Type | Coverage | Description |
|---|---|---|---|
| `jobId` | `string` | 🟢 High (100%) | Unique SEEK job ID (e.g. `"95483992"`). Primary deduplication key. |
| `title` | `string` | 🟢 High (100%) | Job title as advertised. |
| `company` | `string \| null` | 🟢 High (~99%) | Employer or recruitment agency name. |
| `companyLogo` | `string \| null` | 🟢 High (~75%) | Employer branding logo URL on SEEK's CDN. |
| `companyUrl` | `string \| null` | 🟡 Conditional (~40%) | Link to the employer's SEEK company profile page, when available. |
| `classification` | `string \| null` | 🟢 High (100%) | Primary industry classification (e.g. `"Information & Communication Technology"`). |
| `subClassification` | `string \| null` | 🟢 High (100%) | Sub-classification specialty (e.g. `"Engineering - Software"`). |
| `workType` | `string \| null` | 🟢 High (100%) | Employment type (`"Full time"`, `"Contract/Temp"`, `"Part time"`, `"Casual/Vacation"`). |
| `workArrangement` | `string \| null` | 🟡 Conditional (~55%) | Workplace model (`"On-site"`, `"Hybrid"`, `"Remote"`), when tagged by the employer. |
| `roleId` | `string \| null` | 🟢 High (~98%) | Standardized SEEK role slug (e.g. `"AWS-Platform-Engineer"`). |
| `isFeatured` | `boolean` | 🟢 High (100%) | `true` if the listing is a promoted/featured ad. |
| `agentName` | `string \| null` | 🟡 Conditional | Recruiter contact name when specified. |

#### 💰 Compensation, Superannuation & Visa Signals

| Field | Type | Coverage | Description |
|---|---|---|---|
| `salaryRaw` | `string \| null` | 🟡 Conditional (~40%+) | Raw salary text disclosed on the card or parsed from description (e.g. `"$123,000 - $140,000 (inc Super)"`). |
| `salaryMin` | `number \| null` | 🟡 Conditional (~40%+) | Parsed lower numeric salary bound in AUD or NZD (`123000`). |
| `salaryMax` | `number \| null` | 🟡 Conditional (~40%+) | Parsed upper numeric salary bound in AUD or NZD (`140000`). |
| `salaryPeriod` | `string \| null` | 🟡 Conditional (~40%+) | Pay period: `"annual"`, `"daily"`, `"hourly"`, or `"monthly"`. |
| `salaryHasSuper` | `boolean \| null` | 🟡 Conditional | `true` when salary mentions super (`+ super` / `inc super`), `null` when unspecified. |
| `visaSponsorship` | `string \| null` | 🟡 Conditional | `"explicit_sponsorship"`, `"open_to_sponsorship"`, `"no_sponsorship"`, or `null`. Coverage increases significantly with `scrapeDetails: true`. |

#### 📍 Location, Content & Timestamps

| Field | Type | Coverage | Description |
|---|---|---|---|
| `location` | `string` | 🟢 High (100%) | Full SEEK location label (e.g. `"Canterbury, Melbourne VIC"`). |
| `city` | `string \| null` | 🟢 High (100%) | Parsed city or metro area. |
| `state` | `string \| null` | 🟢 High (AU 100%) | Australian state/territory code (`NSW`, `VIC`, `QLD`, `WA`, `SA`, `TAS`, `ACT`, `NT`); `null` for NZ. |
| `suburb` | `string \| null` | 🟡 Conditional | Suburb name when separately structured. |
| `postcode` | `string \| null` | 🟡 Conditional (~40%) | 4-digit postal code extracted from location or SEO hierarchy. |
| `bullets` | `array<string> \| null` | 🟢 High (~65%) | Highlight bullet points displayed on the search card. |
| `teaser` | `string \| null` | 🟢 High (100%) | Short summary teaser from the search result card. |
| `description` | `string \| null` | 🟡 Detail mode | Full plain-text job description (populated when `scrapeDetails: true`). |
| `skills` | `array<string> \| null` | 🟡 Detail mode | Structured skills tags from the job detail page (when `scrapeDetails: true`). |
| `listingUrl` | `string` | 🟢 High (100%) | Direct URL to the SEEK job posting (`https://au.seek.com/job/95483992`). |
| `listedAt` | `string` | 🟢 High (100%) | ISO-8601 posting timestamp. |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO-8601 extraction timestamp. |

#### Sample output record

```json
{
  "jobId": "95483992",
  "title": "AWS Platform Engineer",
  "company": "BGL Corporate Solutions",
  "companyLogo": "https://bx-branding-gateway.cloud.seek.com.au/f65c0a46-2fcb-462d-ba39-11d48c7ad912.1/jdpLogo",
  "companyUrl": "https://au.seek.com/companies/bgl-corporate-solutions-814812",
  "location": "Canterbury, Melbourne VIC",
  "city": "Canterbury Melbourne",
  "state": "VIC",
  "suburb": null,
  "postcode": "3126",
  "classification": "Information & Communication Technology",
  "subClassification": "Engineering - Software",
  "workType": "Full time",
  "workArrangement": "Hybrid",
  "salaryRaw": "$123,000 - $140,000 (inc Super)",
  "salaryMin": 123000,
  "salaryMax": 140000,
  "salaryPeriod": "annual",
  "salaryHasSuper": true,
  "visaSponsorship": null,
  "bullets": [
    "Genuinely flexible work arrangements and work life balance!",
    "Warm and collaborative culture!",
    "Abundance of learning opportunities & a generous annual learning wallet!"
  ],
  "teaser": "You'll own & improve our AWS platform, automate how we build, ship & work in collaboration with developers to help them debug & deploy with confidence!",
  "description": null,
  "skills": null,
  "isFeatured": false,
  "roleId": "AWS-Platform-Engineer",
  "agentName": null,
  "listingUrl": "https://au.seek.com/job/95483992",
  "listedAt": "2026-10-26T00:26:11.000Z",
  "scrapedAt": "2026-11-10T02:00:00.000Z"
}
```

***

### 🔁 Pagination & scaling to 1,000+ SEEK jobs

- **Automatic multi-page pagination:** Each search steps through `?page=1`, `?page=2`, … (`~22 jobs per page`), deduplicating every job by `jobId`.
- **Automatic regional & sort-mode expansion past 550 jobs:** Because SEEK caps any single search query at ~25 pages (~550 jobs), whenever you set `maxRecords` above `400` (e.g. `maxRecords: 1000` or `0` unlimited), the Actor automatically appends `sortmode=ListedDate` and regional/work-type sub-queries (`Sydney`, `Melbourne`, `Brisbane`, `Perth`, `Adelaide`, `Canberra`, `Gold Coast` for AU; `Auckland`, `Wellington`, `Canterbury`, `Waikato`, `Otago` for NZ) and continues scraping seamlessly until your **1,000+ job target** is reached.
- **Comma-separated multi-keyword support:** Enter multiple roles in `keyword` (e.g. `"data analyst, business analyst, product manager"`) to aggregate thousands of deduplicated jobs across related titles in a single run.

***

### ⚙️ How to use & integrate

#### Python SDK example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/seek-scraper").call(run_input={
    "country": "au",
    "keyword": "software engineer",
    "location": "all-sydney-nsw",
    "workType": "full-time",
    "dateRange": "7",
    "scrapeDetails": False,
    "maxRecords": 500,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU"
    }
})

for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{job['jobId']} | {job['title']} @ {job['company']} | {job['salaryRaw']} | {job['listingUrl']}")
```

#### Node.js SDK example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/seek-scraper').call({
    country: 'nz',
    keyword: 'civil engineer, project manager',
    location: 'all-auckland',
    maxRecords: 300,
    proxyConfiguration: {
        useApifyProxy: true,
        apifyProxyGroups: ['RESIDENTIAL'],
        apifyProxyCountry: 'NZ',
    },
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Saved ${items.length} SEEK NZ job listings`);
```

***

### 💡 Pro tips for SEEK scraping

- **Always keep Residential Proxy ON:** SEEK blocks datacenter IP ranges with HTTP 403. Keep `apifyProxyGroups: ["RESIDENTIAL"]` enabled (the default) and set `apifyProxyCountry: "AU"` for `seek.com.au` or `"NZ"` for `seek.co.nz`.
- **Keep `scrapeDetails: false` for fast, low-cost sweeps:** A 100-job search run takes only ~5 pages (~10–15 seconds) and still captures salary, super, classification, bullets, and teaser-level visa hints. Enable `scrapeDetails: true` when you specifically need full job descriptions and skills arrays.
- **Use comma-separated keywords for multi-role datasets:** Instead of launching five separate runs, pass `"accountant, financial analyst, tax manager"` in `keyword` — all results are automatically deduplicated by `jobId`.

***

### ❓ Frequently Asked Questions

#### Why is Residential Proxy enabled by default?

SEEK protects its pages against datacenter IP addresses. Using Apify's `RESIDENTIAL` proxy pool with `AU` or `NZ` geo-targeting ensures 200 OK responses and prevents empty runs.

#### How can I collect more than 550 jobs when SEEK caps search pagination at 25 pages?

Simply set `maxRecords: 1000` (or `0` for unlimited). The Actor automatically expands your query across `ListedDate` sort order and major ANZ metro regions (or work-type facets) once the initial search reaches its 25-page ceiling, deduplicating every listing by `jobId`.

#### How does salary parsing handle `$130k - $150k` vs daily/hourly contractor rates?

The parser normalizes shorthand `k` notation into full dollar figures (`130000` to `150000`) while detecting `"per hour"` / `"p.h."` (`salaryPeriod: "hourly"`) and `"per day"` / `"daily"` (`salaryPeriod: "daily"`).

#### Can I scrape both Australia and New Zealand in the same run?

Yes — pass `startUrls` containing links from both `https://au.seek.com/...` and `https://www.seek.co.nz/...`, or run two tasks with `country: "au"` and `country: "nz"`.

#### How do I calculate total annual remuneration from `salaryMin`, `salaryMax`, and `salaryHasSuper`?

In Australia, when `salaryHasSuper` is `false` (or when `salaryRaw` explicitly states `"+ super"` / `"plus superannuation"`), multiply `salaryMin` and `salaryMax` by `1.115` (the 11.5% Superannuation Guarantee rate) to compare on a total-package basis against `"inc super"` listings.

#### What happens if a niche search has 0 matching jobs on SEEK?

The Actor logs that SEEK returned zero results for the query, sets a clear run status message, and exits cleanly (`SUCCEEDED`) with an empty dataset rather than throwing an error.

***

### 🌏 Pre-configured Australia & New Zealand location slugs (`location`)

| Country | Location Dropdown Value | Coverage Area |
|---|---|---|
| 🇦🇺 **Australia** | `""` (All locations) | Nationwide across all Australian states & territories |
| 🇦🇺 **NSW** | `"all-sydney-nsw"`, `"all-newcastle-maitland-hunter-valley-nsw"`, `"all-wollongong-illawarra-southern-highlands-nsw"`, `"all-new-south-wales"` | Greater Sydney, Newcastle/Hunter, Wollongong/Illawarra, or all NSW |
| 🇦🇺 **VIC** | `"all-melbourne-vic"`, `"all-victoria"` | Greater Melbourne or statewide Victoria |
| 🇦🇺 **QLD** | `"all-brisbane-qld"`, `"all-gold-coast-qld"`, `"all-sunshine-coast-qld"`, `"all-queensland"` | Brisbane, Gold Coast, Sunshine Coast, or statewide Queensland |
| 🇦🇺 **WA / SA** | `"all-perth-wa"`, `"all-western-australia"`, `"all-adelaide-sa"`, `"all-south-australia"` | Perth, Adelaide, and statewide WA / SA |
| 🇦🇺 **ACT / TAS / NT** | `"all-canberra-act"`, `"all-hobart-tas"`, `"all-darwin-nt"`, `"all-tasmania"`, `"all-northern-territory-nt"` | Canberra, Hobart, Darwin, and territory-wide |
| 🇳🇿 **New Zealand** | `"all-auckland"`, `"all-wellington"`, `"all-canterbury"`, `"all-waikato"`, `"all-otago"`, `"all-bay-of-plenty"` | Auckland, Wellington, Christchurch/Canterbury, Hamilton/Waikato, Dunedin/Queenstown, Tauranga |

***

### 🛠️ Ready-to-run workflow recipes

#### Recipe 1: 1,000+ Australian software & data engineering jobs for salary benchmarking

```json
{
  "country": "au",
  "keyword": "software engineer, data engineer, platform engineer, devops engineer",
  "location": "",
  "workType": "full-time",
  "dateRange": "14",
  "scrapeDetails": false,
  "maxRecords": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "AU"
  }
}
```

#### Recipe 2: Visa-sponsoring healthcare & engineering employers (`Subclass 482 / 186`)

```json
{
  "country": "au",
  "keyword": "registered nurse, general practitioner, civil engineer",
  "location": "",
  "workType": "full-time",
  "dateRange": "31",
  "scrapeDetails": true,
  "maxRecords": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "AU"
  }
}
```

***

### 🔗 Related job board & HR intelligence scrapers

- [ZipRecruiter Job Listings & Salary Scraper (US, UK, CA)](https://apify.com/haketa/ziprecruiter-scraper)
- [Xing Jobs Scraper — DACH Job Listings & Salaries](https://apify.com/haketa/xing-jobs-scraper)
- [Arbeitsagentur Job Scraper — German Federal Employment Agency](https://apify.com/haketa/arbeitsagentur-scraper)
- [Naukri Scraper — India Jobs, Salary & Company Ratings](https://apify.com/haketa/naukri-scraper)
- [GulfTalent Jobs Scraper — Middle East & Gulf Executive Jobs](https://apify.com/haketa/gulftalent-jobs-scraper)
- [Workana Jobs Scraper — Freelance Projects & Budgets](https://apify.com/haketa/workana-scraper)

***

### 📋 Changelog

- **v1.2 (2026-11)** — **Unlocked 1,000+ job auto-expansion & multi-keyword support:** Added automatic regional and `ListedDate` facet expansion when `maxRecords > 400` (or `0` unlimited) to scale past SEEK's ~550-result single-search cap, added comma-separated multi-keyword support in `keyword`, changed `maxRecords` schema default to `0` (with fast `100` prefill), and expanded README documentation.
- **v1.1 (2026-07)** — Updated default proxy prefill to `RESIDENTIAL` (`AU`) for 100% reliability against SEEK's datacenter IP blocks; added dedicated IP-rotation retry budget on HTTP 403/429.
- **v1.0 (2026-05)** — Initial release with structured salary + superannuation parsing, 3-tier Subclass 482/186 visa sponsorship detection, 26 ANZ location presets, and optional detail-page enrichment.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/seek-scraper/changelog.md

# Actor input Schema

## `country` (type: `string`):

Which SEEK site to search.

## `keyword` (type: `string`):

What roles to look for, e.g. software engineer, registered nurse, data analyst. Leave empty to pull all recent jobs.

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

Pick a city or state/region. Choose "All locations" (or leave it) to search the whole country. For a place not in the list, use "Custom location" below.

## `locationCustom` (type: `string`):

Optional. Only used when "Location" above is set to "All locations". Type any SEEK place name, e.g. "Cairns QLD" or "Christchurch". Leave empty to search the whole country.

## `workType` (type: `string`):

Employment type to include.

## `workArrangement` (type: `string`):

On-site, hybrid or remote.

## `dateRange` (type: `string`):

Only include jobs listed within this period.

## `scrapeDetails` (type: `boolean`):

Visit each job for the full description, required skills, salary parsed from the description and visa sponsorship detection. Slower but richer.

## `maxRecords` (type: `integer`):

Stop after this many jobs. Set 0 for no limit (automatically expands across regions and facets when collecting 1,000+ jobs).

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

Stop after this many result pages (about 22 jobs per page). Set 0 for no limit.

## `requestDelay` (type: `integer`):

Pause between page requests. 1000-2000ms is recommended for smooth, reliable runs.

## `startUrls` (type: `array`):

Optional. Paste ready-made SEEK search page links to scrape them directly; this overrides the menus above. Most users can leave this empty.

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

Residential proxy is ON by default and recommended for reliable results. Keep the country matched to your target site: AU for seek.com.au, NZ for seek.co.nz.

## Actor input object example

```json
{
  "country": "au",
  "keyword": "software engineer",
  "location": "",
  "locationCustom": "",
  "workType": "all",
  "workArrangement": "all",
  "dateRange": "0",
  "scrapeDetails": false,
  "maxRecords": 100,
  "maxPages": 0,
  "requestDelay": 1000,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# Actor output Schema

## `jobId` (type: `string`):

SEEK job ID

## `title` (type: `string`):

Job title

## `company` (type: `string`):

Hiring company name

## `companyLogo` (type: `string`):

Company logo URL

## `companyUrl` (type: `string`):

Company website URL

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

Full location string

## `city` (type: `string`):

City

## `state` (type: `string`):

State (NSW/VIC/QLD/WA/SA/TAS/ACT/NT)

## `suburb` (type: `string`):

Suburb

## `postcode` (type: `string`):

Postcode

## `classification` (type: `string`):

Industry classification

## `subClassification` (type: `string`):

Sub-classification

## `workType` (type: `string`):

Full-time / Part-time / Contract / Casual

## `workArrangement` (type: `string`):

On-site / Hybrid / Remote

## `salaryRaw` (type: `string`):

Salary display string

## `salaryMin` (type: `string`):

Minimum salary (AUD/NZD)

## `salaryMax` (type: `string`):

Maximum salary (AUD/NZD)

## `salaryPeriod` (type: `string`):

annual / monthly / hourly / daily

## `salaryHasSuper` (type: `string`):

Salary includes superannuation

## `visaSponsorship` (type: `string`):

explicit_sponsorship / open_to_sponsorship / no_sponsorship

## `bullets` (type: `string`):

Job listing bullet points

## `teaser` (type: `string`):

Search result teaser text

## `description` (type: `string`):

Full job description

## `skills` (type: `string`):

Required skills list

## `isFeatured` (type: `string`):

Featured/boosted listing

## `roleId` (type: `string`):

SEEK role ID

## `agentName` (type: `string`):

Recruitment agent name

## `listingUrl` (type: `string`):

SEEK job listing URL

## `listedAt` (type: `string`):

Listing date

## `scrapedAt` (type: `string`):

ISO scrape timestamp

# 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 = {
    "country": "au",
    "keyword": "software engineer",
    "location": "",
    "locationCustom": "",
    "workType": "all",
    "workArrangement": "all",
    "dateRange": "0",
    "scrapeDetails": false,
    "maxRecords": 100,
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/seek-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 = {
    "country": "au",
    "keyword": "software engineer",
    "location": "",
    "locationCustom": "",
    "workType": "all",
    "workArrangement": "all",
    "dateRange": "0",
    "scrapeDetails": False,
    "maxRecords": 100,
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/seek-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 '{
  "country": "au",
  "keyword": "software engineer",
  "location": "",
  "locationCustom": "",
  "workType": "all",
  "workArrangement": "all",
  "dateRange": "0",
  "scrapeDetails": false,
  "maxRecords": 100,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call haketa/seek-scraper --silent --output-dataset

```

## MCP server setup

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