# SEEK Job Listings Scraper: AU & NZ Jobs (`xmolodtsov/seek-jobs-scraper`) Actor

Search public SEEK job listings in Australia and New Zealand. Export titles, employers, locations, salary text, classifications and redacted full descriptions with SEEK apply links.

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

## Pricing

from $1.25 / 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.
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

Extract public SEEK job listings from Australia and New Zealand by keyword, location and source filters. Each result includes the advertised title, employer display name, location, salary text, employment type and classification. Optional details add a plain-text description and SEEK application/share landing link.

Use the data to compare advertised roles, track hiring demand, build a job feed or review salary disclosures. Search and details are public; this actor does not log in or request recruiter/contact objects. Email addresses and AU/NZ phone formats in teaser, bullet points and description text are replaced with `[redacted]`.

![SEEK jobs scraper avatar](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/seek-jobs-avatar.png)

### Quick start

1. Enter one or more `searchTerms`.
2. Select `AU` or `NZ`. Use separate runs for the two countries.
3. Set a run-wide `maxItems` and choose whether to include descriptions.
4. Run the actor, then export the dataset as JSON, CSV or Excel.

The prefilled example requests 20 Australian software engineering jobs with descriptions:

```json
{"searchTerms":["software engineer"],"country":"AU","maxItems":20,"includeDetails":true}
```

For a broader search, combine distinct keywords and optional filters:

```json
{"searchTerms":["software engineer","data engineer"],"country":"NZ","location":"Auckland","classification":["6281"],"workType":["full time","contract"],"dateRange":7,"salaryMin":70000,"salaryMax":130000,"salaryType":"annual","maxItems":200,"includeDetails":true}
```

`maxItems` counts unique job IDs across the entire run. A job found by several terms is saved once, under the term whose page returned it first (terms are read one page each in turn).

### Input reference

| Field | Default | Meaning |
|---|---|---|
| `searchTerms` | Required | 1–20 non-empty strings, trimmed and deduplicated |
| `country` | `AU` | `AU` for Australia or `NZ` for New Zealand |
| `location` | Omitted | SEEK location filter, for example Sydney or Auckland |
| `classification` | All | Array of top-level SEEK classification IDs selected in the input editor |
| `workType` | All | Array containing `full time`, `part time`, `contract` or `casual` |
| `dateRange` | Omitted | Listed within 1, 3, 7, 14 or 31 days |
| `salaryMin`, `salaryMax` | Omitted | Non-negative advertised salary bounds; minimum must not exceed maximum |
| `salaryType` | Omitted | `annual` or `hourly`, required with either salary bound |
| `maxItems` | `100` | Total unique listings, from 1 to 5000; free-plan cap below |
| `includeDetails` | `true` | Full redacted description and SEEK apply/share landing link |
| `proxyConfiguration` | Apify datacenter | Optional Apify residential; AU exit supports either country |

Salary amounts use AUD in AU and NZD in NZ. Salary text is the advertisement's original wording, including ranges, benefits or hourly periods. The actor does not estimate missing salaries. SEEK decides whether undisclosed salaries match a salary filter.

### Output

One row represents one job listing. This example is from an actual end-to-end run; the description is shortened here for readability.

```json
{
  "jobId": "95363058",
  "title": "Software Developer",
  "company": "Department of Primary Industries and Regions",
  "location": "Adelaide SA",
  "country": "AU",
  "salaryText": null,
  "workType": [
    "Full time"
  ],
  "classification": "Information & Communication Technology",
  "subclassification": "Developers/Programmers",
  "listedDate": "2026-10-19T22:52:22.000Z",
  "teaser": "Design, develop and support enterprise applications, delivering secure, innovative and business-focused digital solutions for PIRSA.",
  "bulletPoints": [
    "Develop innovative digital solutions that support industries across SA",
    "Drive the full application lifecycle from design through to implementation.",
    "Flexible working arrangements available."
  ],
  "description": "The Opportunity We have an opportunity for a Software Developer to be part of our Corporate Services Division within the Department of Primary Industries and Regions. In this role, you will contribute to the delivery, maintenance and enhancement of critical business applications that support the department's operations and strategic priorities. Working within a collaborative ICT environment, you will apply your technical expertise to analyse, des…",
  "jobUrl": "https://www.seek.com.au/job/95363058",
  "applyUrl": "https://au.seek.com/job/95363058?tracking=SHR-WEB-SharedJob-anz-1",
  "searchTerm": "software engineer",
  "scrapedAt": "2026-10-20T19:31:36.252Z"
}
```

`jobId` is the deduplication key. `workType` and `bulletPoints` are arrays. `classification` and `subclassification` contain source descriptions. `listedDate` and `scrapedAt` are ISO timestamps. `salaryText` is null when no salary is displayed. `description` and `applyUrl` are null when details are disabled; a detail failure also preserves the listing with those fields null.

`jobUrl` opens the listing. `applyUrl` is the SEEK share/application landing page. It does not promise a direct external applicant-tracking-system URL. Some optional text or metadata can be missing at the source.

![Job listings output preview](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/seek-jobs-output-preview.png)

### Pricing

Pay per saved job listing through the `apify-default-dataset-item` event. The same price includes optional descriptions: there is no start charge or separate detail fee.

| Apify plan | Per 1,000 saved listings |
|---|---:|
| FREE | $2.25 |
| BRONZE | $2.00 |
| SILVER | $1.60 |
| GOLD | $1.25 |
| PLATINUM / DIAMOND | $1.25 |

| Example run | BRONZE actor charge | GOLD actor charge |
|---|---:|---:|
| 20 listings with descriptions | $0.04 | $0.025 |
| 200 listings with descriptions | $0.40 | $0.25 |
| 1,000 listings with descriptions | $2.00 | $1.25 |

These examples count saved listings only and show actor event charges. Apify applies its current plan and platform billing rules. Source availability and the run budget determine how many listings can be saved.

#### Is it free?

You can use the actor on Apify's free plan with your available platform credits. The developer limits free-plan use to **100 results per run and 20 runs per calendar month (UTC)**. This allowance is not a promise of zero platform charges. The run count resets on the first day of the month. Paid Apify plans use the requested result limit and have no developer monthly run cap.

Free runs use Apify Proxy and ignore custom proxy URLs. When the monthly allowance is exhausted, the actor succeeds with a clear refusal message, no target requests and an empty dataset. Concurrent starts share the same atomic developer-owned quota. The owner's account and platform TEST checks are exempt.

### Reliability and limits

SEEK pagination currently exposes roughly 500 search slots per keyword, even when the reported total is larger. Promoted listings can repeat, reducing the unique count. If pagination ends before the reported total and requested limit, the actor records `truncated: true` for that term in the `STATISTICS` key and logs it once. Increase the number of meaningful keywords or narrow source filters to improve coverage; this actor does not split searches automatically.

Transient failures retry up to three times with a fresh proxy session. A valid empty JSON result is treated as no results. HTML challenges and blocked HTTP statuses are recorded separately. Public endpoints can change; the actor offers no coverage or availability guarantee.

If descriptions fail after retries, search rows remain in the dataset and `detailFailures` records the missing details. If a later error or deadline stops the run after rows were saved, the run succeeds as partial and preserves those rows. A zero-row processing failure fails with a diagnostic status prefix. A confirmed empty answer for every term succeeds as no results. A charge-limited run succeeds with “run budget reached.”

The `STATISTICS` key records request and answer counts, blocks by status, transferred body bytes, saved rows, detail failures, duration and per-term truncation. Compressed body bytes are diagnostic measurements; they exclude proxy headers and protocol overhead. The actor stops starting requests before the cloud timeout to leave time for saved rows and statistics.

Default memory is 256 MB with a 512 MB cap. Apify datacenter is the default proxy; select residential explicitly if your use case needs it. Selected proxy modes do not silently change during cloud retries.

### API and integrations

Start a run with the Apify API and use the returned dataset ID to fetch results:

```bash
curl -X POST 'https://api.apify.com/v2/acts/xmolodtsov~seek-jobs-scraper/runs' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"searchTerms":["software engineer"],"country":"AU","maxItems":20,"includeDetails":true}'
```

Apify integrations can send completed dataset rows to a spreadsheet, database or workflow in n8n, Make or Zapier. Use a completion webhook to process the finished dataset, and key updates by `jobId`. Check `scrapedAt`, `listedDate` and partial-run statistics before comparing snapshots.

### Support

Report a reproducible problem through this actor's Apify Issues tab. Include the run ID, country and keyword/filter settings. Avoid including personal contact information. For missing descriptions, check `detailFailures` and whether the public listing is still available.

### More scrapers from this developer

**TikTok:** [TikTok Search Scraper](https://apify.com/xmolodtsov/tiktok-search-scraper): videos and creators for any keyword, pay per result · [TikTok Profile Scraper (Pay Per Result)](https://apify.com/xmolodtsov/tiktok-profile-scraper): profiles, followers and latest posts by username · [TikTok Comments Scraper](https://apify.com/xmolodtsov/tiktok-comments-scraper): comments and full reply threads from any video · [TikTok Hashtag Scraper](https://apify.com/xmolodtsov/tiktok-hashtag-scraper): videos for any hashtag, with views, likes and music · [TikTok Sound & Music Scraper](https://apify.com/xmolodtsov/tiktok-sound-scraper): videos that use a sound or song · [TikTok Top Ads Scraper](https://apify.com/xmolodtsov/tiktok-top-ads-scraper): public Creative Center ad rankings, engagement, media and landing pages

**Social & news:** [Reddit Search Scraper](https://apify.com/xmolodtsov/reddit-scraper): posts by keyword, subreddit or author · [Google News Scraper](https://apify.com/xmolodtsov/google-news-scraper): Google News results as clean full-text articles

**E-commerce:** [Prom.ua Product Search Scraper](https://apify.com/xmolodtsov/prom-ua): Prom.ua product search results, no browser needed · [Amazon Product Search & Bestsellers Scraper](https://apify.com/xmolodtsov/amazon-search-scraper): search results, Best Sellers and product details from Amazon · [AliExpress Search Scraper](https://apify.com/xmolodtsov/aliexpress-search-scraper): aliExpress products by keyword with prices, orders and shipping

**Maps & leads:** [Google Maps Scraper](https://apify.com/xmolodtsov/google-maps-scraper): places, leads and emails from Google Maps

**Ads:** [Facebook Ad Library Scraper (Meta Ads Library)](https://apify.com/xmolodtsov/facebook-ads-library-scraper): ads from the Meta Ad Library, with EU reach and payers · [Google Ads Transparency Scraper](https://apify.com/xmolodtsov/google-ads-transparency-scraper): Google ad creatives by advertiser or domain, with regional details

**Video:** [YouTube Transcript Scraper](https://apify.com/xmolodtsov/youtube-transcript-scraper): transcripts, subtitles and captions from YouTube videos · [YouTube Shorts Scraper](https://apify.com/xmolodtsov/youtube-shorts-scraper): Shorts of any channel with exact views, likes and duration · [YouTube Channel Scraper](https://apify.com/xmolodtsov/youtube-channel-scraper): every video of a channel, with channel stats · [YouTube Search Scraper](https://apify.com/xmolodtsov/youtube-search-scraper): search results and videos for any keyword · [YouTube Comments Scraper](https://apify.com/xmolodtsov/youtube-comments-scraper): comments, replies and likes from any video · [Bilibili Comments Scraper](https://apify.com/xmolodtsov/bilibili-comments-scraper): public hot comments and reply threads by video or keyword

### FAQ and public-data use

#### Is it legal to scrape SEEK?

This actor retrieves public job advertisements and does not request private profiles or contact objects. It redacts recognizable email addresses and AU/NZ phone numbers from description text, teasers and bullet points. It is not a contact-enrichment tool.

Public availability does not remove your responsibilities under applicable terms, copyright and privacy law. Review SEEK's terms and your intended use, including GDPR, CCPA and the Australian Privacy Act where applicable. Keep collection proportionate, minimize retention and avoid identifying or contacting individuals from job text. Redaction covers tested formats rather than every possible way personal information can be written; review outputs before redistribution.

#### Why did I get fewer listings than requested?

`maxItems` is an upper bound. Filters, source depth limits, duplicate promotions, expired listings, free-plan limits, run budgets and interrupted requests can reduce the count. Inspect `STATISTICS` for details.

#### Can I collect both countries in one run?

Choose one country per run. Launch one AU run and one NZ run, then combine their datasets by `jobId` if needed.

# Changelog

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

# Actor input Schema

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

One to twenty public job keywords. Trimmed and deduplicated; a job found by several terms is saved once, under the term whose page returned it first (terms are read one page each in turn).

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

Search Australia (AU) or New Zealand (NZ). Run each country separately.

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

Optional SEEK location, for example Sydney or Auckland. Sent as the where filter.

## `classification` (type: `array`):

Optional top-level SEEK job classifications. Leave empty to search every classification.

## `workType` (type: `array`):

Optional employment types. Multiple values are passed to SEEK as worktype IDs.

## `dateRange` (type: `integer`):

Optional maximum age in days: 1, 3, 7, 14 or 31. No filter when omitted.

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

Optional minimum advertised salary. Set salaryType to annual or hourly; undisclosed salaries may still appear according to SEEK filtering.

## `salaryMax` (type: `number`):

Optional maximum salary, at least salaryMin. Set salaryType when using salary limits.

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

Required with salaryMin or salaryMax. Values use the country currency: AUD for AU, NZD for NZ.

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

Run-wide unique job limit across all terms (1–5000). Apify free plan: up to 100 results/run and 20 runs/calendar month (UTC), a developer limit. Paid Apify plans use the requested limit.

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

Fetch the public full job description and SEEK application/share landing link. Contact information in text is redacted. Failed details keep the listing with null description and applyUrl.

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

Apify datacenter by default. Optional RESIDENTIAL, with AU exit usable for both countries. Free runs always use Apify Proxy and discard custom transport settings. Explicit paid/local useApifyProxy:false enables direct access.

## Actor input object example

```json
{
  "searchTerms": [
    "software engineer"
  ],
  "country": "AU",
  "maxItems": 20,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One unique public job listing per row: jobId, title, company, location, country, salaryText, workType, classification, subclassification, listedDate, teaser, bulletPoints, description, jobUrl, applyUrl, searchTerm and scrapedAt. Descriptions and applyUrl are null when details are disabled or unavailable.

# 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": [
        "software engineer"
    ],
    "country": "AU",
    "maxItems": 20,
    "includeDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("xmolodtsov/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 = {
    "searchTerms": ["software engineer"],
    "country": "AU",
    "maxItems": 20,
    "includeDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("xmolodtsov/seek-jobs-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": [
    "software engineer"
  ],
  "country": "AU",
  "maxItems": 20,
  "includeDetails": true
}' |
apify call xmolodtsov/seek-jobs-scraper --silent --output-dataset

```

## MCP server setup

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