# SEEK Jobs Scraper: Australia & New Zealand (`tindacloud/seek-jobs-scraper`) Actor

Scrape job listings from SEEK Australia and New Zealand: title, company, salary, location, remote/hybrid, classification, full description, expiry and company rating. Search by keyword, location and filters, or paste SEEK URLs.

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

## Pricing

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

Scrape job listings from **SEEK Australia (seek.com.au)** and **SEEK New Zealand (seek.co.nz)**, the largest job boards in both countries. Search by keyword, location and SEEK's own filters, or paste SEEK search URLs. You get clean, structured data including the **full job description, salary, remote/hybrid, expiry date and company profile** (website, size, industry, employee rating).

### Why this scraper

- **Full details in one run.** Description (plain text + HTML), expiry date, whether you apply on an external site, company website, size, industry and SEEK company rating. No second actor needed.
- **Beyond SEEK's ~10,000-result cap.** Broad searches are automatically split by classification, so "all jobs listed in the last 31 days in Australia" returns everything, not just the first 10k.
- **All of SEEK's filters:**
  - keywords and locations
  - listed date (24h / 3 / 7 / 14 / 31 days)
  - classification, work type, and remote / hybrid / on-site
  - salary range (annual, monthly or hourly)
  - sort by newest
- **Australia and New Zealand.** Switch with one setting.
- **Monitoring mode.** *Only new jobs since last run* skips jobs you already received for the same search. Schedule it daily for job alerts or lead feeds.
- **Fast and cheap.** Tested at 12,000 jobs in about 2.5 minutes.

### Input example

```json
{
  "keywords": ["registered nurse", "aged care"],
  "locations": ["Sydney NSW", "Melbourne VIC"],
  "country": "AU",
  "dateRange": "7",
  "workTypes": ["fullTime", "partTime"],
  "workArrangements": ["hybrid", "remote"],
  "salaryMin": 80000,
  "salaryType": "annual",
  "sortBy": "date",
  "includeDetails": true,
  "maxResults": 1000
}
```

Each keyword is searched in each location. You can also use `startUrls` with SEEK search pages, e.g. `https://www.seek.com.au/nurse-jobs/in-Sydney-NSW?daterange=3`.

### Output example

```json
{
  "id": "94698103",
  "title": "ESG & Sustainability Analyst | Property",
  "company": "CBRE",
  "location": "Sydney NSW",
  "locationHierarchy": [
    "All Sydney NSW",
    "New South Wales NSW"
  ],
  "country": "AU",
  "classification": "Consulting & Strategy",
  "subClassification": "Environment & Sustainability Consulting",
  "workTypes": [
    "Full time"
  ],
  "workArrangement": null,
  "salary": "Salary + KPI Performance Bonus",
  "teaser": "Drive ESG performance through sustainability reporting, data analytics and stakeholder collaboration across a premium property portfolio.",
  "bulletPoints": [
    "Support ESG reporting, sustainability data & performance insights",
    "Work with Deepki, GRESB, NGERS & ASRS reporting"
  ],
  "listedAt": "2026-09-17T06:12:56Z",
  "isFeatured": false,
  "url": "https://www.seek.com.au/job/94698103",
  "description": "Shape ESG Performance across commercial property assets\nWork with Industry leading ESG Pla…",
  "descriptionHtml": "<p>…</p>",
  "expiresAt": "2026-10-17T12:59:59.999Z",
  "appliesOnExternalSite": true,
  "companyWebsite": "https://www.cbre.com.au/",
  "companySize": "More than 10,000 employees",
  "companyIndustry": "Commercial & Industrial Property Management",
  "companyRating": 3.2,
  "companyReviewCount": 139,
  "companyProfileUrl": "https://au.seek.com/companies/cbre-432744"
}
```

`salary`, `workArrangement` and the company fields are `null` when the employer doesn't provide them. With *Include full job details* off, the description and company fields are omitted and runs are faster.

### Use cases

- **Recruitment agencies:** find hiring companies and roles in your niche every morning.
- **Job seekers & career coaches:** daily alerts with salary and remote filters.
- **Sales & lead generation:** companies that are growing teams, with website and size.
- **Labour-market & salary research:** demand by classification, location and pay across AU/NZ.
- **Job boards & aggregators:** a structured feed of SEEK listings.

### Pricing

Pay per job returned, plus a negligible start fee per run. Full details are included at the same price. Set **Max results** or a spending limit to cap cost.

### Notes

- Only publicly listed job ads are collected; no login is used.
- SEEK locations work best in SEEK's own format, e.g. "Sydney NSW", "Brisbane QLD", "Auckland".
- If SEEK changes something and a run breaks, open an issue and it will be fixed quickly.

# Actor input Schema

## `keywords` (type: `array`):

Job titles or skills to search, e.g. “registered nurse”, “data analyst”. Each keyword is searched separately. Leave empty to browse all jobs matching the other filters.

## `locations` (type: `array`):

SEEK locations, e.g. “Sydney NSW”, “Melbourne VIC”, “Auckland”. Empty = the whole country.

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

Which SEEK site to search.

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

Paste search result URLs from seek.com.au or seek.co.nz, e.g. https://www.seek.com.au/nurse-jobs/in-Sydney-NSW?daterange=3. Filters in the URL are kept.

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

Only jobs listed within this period.

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

SEEK job categories. Empty = all.

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

Empty = any.

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

Empty = any.

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

Uses SEEK's salary filter (in the pay type below).

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

Leave empty for no upper limit.

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

How the salary range above is expressed.

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

Order of results.

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

Adds the full description (text + HTML), expiry date, whether you apply on an external site, and company website, size, industry and rating. Same price.

## `onlyNewJobs` (type: `boolean`):

Remembers the jobs already returned for each search and skips them next time. Schedule it daily for alerts.

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

Stop after this many jobs in total. You are charged per job.

## `proxy` (type: `object`):

Apify datacenter proxy works well for SEEK.

## Actor input object example

```json
{
  "keywords": [
    "data analyst"
  ],
  "locations": [
    "Sydney NSW"
  ],
  "country": "AU",
  "salaryType": "annual",
  "sortBy": "date",
  "includeDetails": true,
  "onlyNewJobs": false,
  "maxResults": 500,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

All scraped jobs in a table view.

# 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 analyst"
    ],
    "locations": [
        "Sydney NSW"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tindacloud/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": ["data analyst"],
    "locations": ["Sydney NSW"],
}

# Run the Actor and wait for it to finish
run = client.actor("tindacloud/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 '{
  "keywords": [
    "data analyst"
  ],
  "locations": [
    "Sydney NSW"
  ]
}' |
apify call tindacloud/seek-jobs-scraper --silent --output-dataset

```

## MCP server setup

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