# SEEK Job Scraper — Australia & New Zealand (`axlymxp/seek-job-scraper`) Actor

Scrape SEEK jobs (seek.com.au & seek.co.nz): title, company, salary, work type/arrangement, classification, full description, applicant-demand count, structured location and contacts. Optionally attach each employer's SEEK rating breakdown. Anonymous public API, pay per job.

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

## Pricing

from $2.00 / 1,000 dataset items

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 Job Scraper — Australia & New Zealand

Scrape jobs from **SEEK** (`seek.com.au` and `seek.co.nz`) as clean JSON — title,
company, salary, work type, classification, **full description**, **applicant-demand
count**, structured location and contacts.

**What makes this one different:** turn on **`enrichCompanyRatings`** and every job
row also carries the employer's **SEEK rating breakdown** (overall, management,
work-life balance, diversity, career, benefits, recommend %) — so you can rank and
filter roles by *employer quality*, not just keywords. No other SEEK scraper does this.

Built on SEEK's public search + GraphQL APIs — anonymous, no login, no anti-bot wall
on the data surface.

### Who it's for

- **Job seekers & career coaches** — find roles *and* see which employers are
  well-rated before applying.
- **Recruiters & sourcers** — build lead lists with contacts, applicant demand and
  employer reputation in one pass.
- **Market & talent analysts** — track hiring demand, salary and employer sentiment
  across a role family or region.
- **Data / AI teams** — a clean, documented jobs schema for dashboards, ATS feeds and
  agents.

### What you get — output fields

**Every row (listing)**

| Field | Type | Description |
| ----- | ---- | ----------- |
| `job_id` / `title` / `url` / `apply_url` | string | Job id, title and links |
| `company_name` / `advertiser_id` / `advertiser_name` | string | Hirer / advertiser |
| `salary_label` | string | Salary as shown on the card |
| `work_types` / `work_arrangements` | mixed | Employment type & arrangement |
| `classification` / `sub_classification` (+ ids) | string | SEEK category |
| `location` / `area` | string | Location labels |
| `listing_date` / `listing_date_display` | string | When it was listed |
| `teaser` / `bullet_points` | mixed | Ad summary & highlights |
| `is_featured` / `is_promoted` / `logo_url` | mixed | Ad metadata |

**With `includeDetails` (default on)**

| Field | Type | Description |
| ----- | ---- | ----------- |
| `description_html` / `description_text` | string | Full job description |
| `salary` / `phone` / `emails` | mixed | Salary & extracted contacts |
| `applicant_count` / `applicant_count_label` / `applicant_volume_label` | mixed | **Applicant demand** |
| `suburb` / `state` / `postcode` / `region` | string | Structured location |
| `work_arrangement_types` / `screening_questions` | array | Arrangement & screening Qs |
| `expires_at` / `normalised_role_title` / `advertiser_verified` | mixed | Extra detail |

**With `enrichCompanyRatings` (the differentiator)**

| Field | Type | Description |
| ----- | ---- | ----------- |
| `company_rating_overall` / `company_review_count` / `company_recommend_pct` | number | Employer rating & volume |
| `company_rating_management` / `_work_life_balance` / `_diversity` / `_career` / `_benefits_perks` / `_work_environment` | number | Sub-ratings (1–5) |

*(Employer ratings are populated for companies that have a SEEK company profile with
enough reviews.)*

### High-value use cases

1. **Quality-ranked job search** — pull roles for a keyword/location and sort by
   `company_rating_overall` to surface jobs at well-rated employers.
2. **Low-competition targeting** — filter by `applicant_count` to find roles before
   they get flooded.
3. **Recruitment lead-gen** — collect advertiser, contacts and demand signals for a
   role family.
4. **Salary & demand benchmarking** — track salary labels and applicant volume across
   regions over time.
5. **AI / ATS pipelines** — feed a clean jobs schema (with employer reputation) into
   agents and dashboards.

### Input parameters

| Field | Type | Default | Description |
| ----- | ---- | ------- | ----------- |
| `queries` | array<string> | `["software engineer"]` | Keywords (one search each) |
| `location` | string | — | SEEK location label, e.g. "All Sydney NSW" |
| `country` | enum | `AU` | `AU` (seek.com.au) or `NZ` (seek.co.nz) |
| `jobUrls` | array<string> | — | Direct SEEK job URLs / ids |
| `maxItems` | integer | 200 | Global cap (SEEK returns ~500 per search) |
| `includeDetails` | boolean | true | Fetch full description, applicant demand, location |
| `enrichCompanyRatings` | boolean | false | Attach employer SEEK ratings |
| `classification` | string | — | SEEK classification id |
| `workType` | enum | Any | Full time / Part time / Contract / Casual |
| `workArrangement` | enum | Any | On-site / Hybrid / Remote |
| `salaryMin` / `salaryMax` / `salaryType` | int/enum | — | Salary filter |
| `dateRange` | enum | Any time | Posted within 1/3/7/14/31 days |
| `sortBy` | enum | relevance | `relevance` or `date` |

### Example input

```json
{
  "queries": ["software engineer", "data analyst"],
  "location": "All Sydney NSW",
  "country": "AU",
  "maxItems": 200,
  "includeDetails": true,
  "enrichCompanyRatings": true,
  "dateRange": "7",
  "sortBy": "date"
}
```

### Example output (enriched job row)

```json
{
  "job_id": "94483533",
  "title": "Integration Specialist",
  "company_name": "CAE Australia",
  "url": "https://www.seek.com.au/job/94483533",
  "country": "AU",
  "location": "Homebush, Sydney NSW",
  "state": "New South Wales",
  "postcode": "2140",
  "salary": "$120,000 – $140,000 per year",
  "work_types": ["Full time"],
  "work_arrangement_types": ["Hybrid"],
  "classification": "Information & Communication Technology",
  "applicant_count": 42,
  "applicant_volume_label": "Low application volume",
  "company_rating_overall": 4.0,
  "company_recommend_pct": 80,
  "company_rating_work_life_balance": 3.9,
  "description_text": "About the role ...",
  "scraped_at": "2026-09-15T07:40:00Z"
}
```

### Pricing

Pay-per-event:

- **Actor start:** $0.01 per run
- **Per job:** $0.002 per row

Example: 200 jobs with full detail = **$0.01 + 200 × $0.002 = $0.41**.

### Scheduling & integrations

- **Schedule** daily runs to track new roles and hiring demand.
- **Webhooks** on completion push new jobs to your app, Make or Zapier.
- **Export** to JSON, CSV, Excel or Google Sheets, or use the dataset API.

### Use with AI assistants (MCP)

Apify Actors are callable from AI assistants via the Model Context Protocol, so an
agent can pull live SEEK roles (e.g. "find remote data jobs in Melbourne at
employers rated 4+ on SEEK"). Point your MCP client at this Actor and pass the same
input schema.

### FAQ

**How many jobs can I get?** SEEK caps a single search at roughly 500 results; use
multiple keywords/locations to widen coverage. `maxItems` bounds the run.

**Does it cover New Zealand?** Yes — set `country` to `NZ`.

**Why are some employer ratings empty?** Only employers with a SEEK company profile
and enough reviews have an aggregate rating; others return null rating fields.

**How fresh is the data?** Live — every run queries SEEK at request time.

**Do I need a proxy?** No login or credentials. The public API works from most IPs;
the default Apify Proxy avoids datacenter rate-limits. Switch to Residential if you
see empty results.

**Is scraping this legal?** You are responsible for your use. The Actor collects
publicly available job data for research and analytics; comply with SEEK's terms and
applicable law before processing personal data such as recruiter contacts. This Actor
is not affiliated with SEEK.

# Actor input Schema

## `queries` (type: `array`):

Keywords to search on SEEK (one search per keyword). Leave empty to browse all jobs for the location/filters.

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

Location label as SEEK shows it, e.g. "All Sydney NSW", "Melbourne VIC" or "All Australia". Applied to every keyword.

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

Which SEEK market to search — Australia (seek.com.au) or New Zealand (seek.co.nz).

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

Direct SEEK job URLs or numeric job ids to fetch full detail for (in addition to any keyword searches).

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

Global cap across all queries and URLs. The run stops once this many jobs are pushed. SEEK returns up to ~500 results per search.

## `maxItemsPerQuery` (type: `integer`):

Optional per-keyword cap (0 = no per-keyword cap). SEEK's own depth limit is ~500 per search.

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

Fetch each job's detail page: full description (HTML + text), applicant-demand count, structured location (suburb/state/postcode), work arrangement, screening questions and contacts. Turn off for a faster, cheaper listing-only run.

## `enrichCompanyRatings` (type: `boolean`):

For each job, attach the employer's SEEK rating breakdown (overall, management, work-life balance, diversity, career, benefits) so you can filter roles by employer quality. Requires full details; only populated for companies with a SEEK company profile.

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

SEEK classification id to filter by (e.g. 6281 = Information & Communication Technology). Found as "classification\_id" in output rows.

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

Filter by employment type.

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

Filter by work arrangement.

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

Minimum salary in the market's currency (AUD/NZD). Combine with salary type.

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

Maximum salary in the market's currency (AUD/NZD).

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

Whether the salary range is annual or hourly.

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

Only jobs posted within this many days (SEEK supports 1, 3, 7, 14, 31).

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

Sort search results by relevance or by date listed.

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

Proxy used to reach SEEK. The public API works from most IPs; Apify Proxy (the default) avoids datacenter rate-limits. Switch to Residential if you see empty results.

## Actor input object example

```json
{
  "queries": [
    "software engineer",
    "data analyst"
  ],
  "location": "All Sydney NSW",
  "country": "AU",
  "jobUrls": [
    "https://www.seek.com.au/job/94483533"
  ],
  "maxItems": 200,
  "maxItemsPerQuery": 0,
  "includeDetails": true,
  "enrichCompanyRatings": false,
  "workType": "",
  "workArrangement": "",
  "salaryType": "annual",
  "dateRange": "0",
  "sortBy": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped job rows 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 = {
    "queries": [
        "software engineer"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/seek-job-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 = {
    "queries": ["software engineer"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/seek-job-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 '{
  "queries": [
    "software engineer"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call axlymxp/seek-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/seek-job-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/aKJIBBp1WSaX6xSah/builds/5kcxgavuAKpVe2BbX/openapi.json
